(libc.info.gz) Process Creation Example
Info Catalog
(libc.info.gz) BSD Wait Functions
(libc.info.gz) Processes
26.9 Process Creation Example
=============================
Here is an example program showing how you might write a function
similar to the built-in 'system'. It executes its COMMAND argument
using the equivalent of 'sh -c COMMAND'.
#include <stddef.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
/* Execute the command using this shell program. */
#define SHELL "/bin/sh"
int
my_system (const char *command)
{
int status;
pid_t pid;
pid = fork ();
if (pid == 0)
{
/* This is the child process. Execute the shell command. */
execl (SHELL, SHELL, "-c", command, NULL);
_exit (EXIT_FAILURE);
}
else if (pid < 0)
/* The fork failed. Report failure. */
status = -1;
else
/* This is the parent process. Wait for the child to complete. */
if (waitpid (pid, &status, 0) != pid)
status = -1;
return status;
}
There are a couple of things you should pay attention to in this
example.
Remember that the first 'argv' argument supplied to the program
represents the name of the program being executed. That is why, in the
call to 'execl', 'SHELL' is supplied once to name the program to execute
and a second time to supply a value for 'argv[0]'.
The 'execl' call in the child process doesn't return if it is
successful. If it fails, you must do something to make the child
process terminate. Just returning a bad status code with 'return' would
leave two processes running the original program. Instead, the right
behavior is for the child process to report failure to its parent
process.
Call '_exit' to accomplish this. The reason for using '_exit'
instead of 'exit' is to avoid flushing fully buffered streams such as
'stdout'. The buffers of these streams probably contain data that was
copied from the parent process by the 'fork', data that will be output
eventually by the parent process. Calling 'exit' in the child would
output the data twice. Termination Internals.
Info Catalog
(libc.info.gz) BSD Wait Functions
(libc.info.gz) Processes
automatically generated by
info2html