Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 22 Oct 2001 23:18:49 -0700 (PDT)
From:      David Kirchner <davidk@accretivetg.com>
To:        Matthew Blacklow <matthew.blacklow@ticca.com>
Cc:        freebsd-questions <freebsd-questions@FreeBSD.ORG>
Subject:   Re: C clue on FreeBSD again!
Message-ID:  <20011022230153.Q85958-100000@localhost>
In-Reply-To: <NFBBICMIIEMNIMGOBPCMGEIKCEAA.matthew.blacklow@ticca.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 23 Oct 2001, Matthew Blacklow wrote:

> Yesterday I made a post asking how to suppress the output of a program
> spawned in C using the System() function.
> The replies I had were very helpful and successfully supressed the output.
> However they worked a little too good and they even suppressed the return
> value of the program which i really need to capture.
>
> When I dont suppress the output it works fine so I know that the suppressed
> output is why i am getting weird return values.

Here's another way to do it, without system () (I don't recall if someone
posted this way before. Also I can't guarantee this is the best way to do
it, :) )

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>

int
main (int argc, char *argv) {
	pid_t	pid;
	int	status;

	if (pid = fork()) {
		printf ("this is the parent speaking\n");
		wait4(pid, &status, 0, NULL);
		printf ("%d\n", WEXITSTATUS (status));
	} else if (pid == 0) {
		char	buf[1024];

		sprintf (buf, "/usr/bin/false");
		close (0);
		close (1);
		close (2);
		execlp (buf, NULL);
		exit (254);
	} else {
		perror ("fork");
		exit (254);
	}
}

This program will fork off a child, close the standard input, output, and
error file descriptors, and then calls execlp to replace itself with a new
process image (that of /usr/bin/false in this case, there are better
examples out there I'm sure. :)


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20011022230153.Q85958-100000>