Copyright (C) 2000-2012 |
GNU Info (libc.info)Process Creation ExampleProcess 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. Note: Termination Internals. automatically generated by info2www version 1.2.2.9 |