WIFEXITED(status) | Возвращает true , если процесс завершился нормально. Процесс завершается нормально, когда его функция main() выходит из программы посредством вызова exit() . Если WIFEXITED истинно, то WEXITSTATUS(status) возвращает код возврата процесса. |
WIFSIGNALED(status) | Возвращает true , если процесс был прерван сигналом (это происходит, когда он прерывается вызовом kill() ). В этом случае WTERMSIG(status) возвращает номер сигнала, прервавшего процесс. |
WIFSTOPPED(status) | Если процесс приостановлен сигналом, WIFSTOPPED() возвращает true , a WSTOPSIG(status) возвращает номер сигнала, приостановившего процесс. wait4() возвращает информацию только о приостановленных процессах, если указана опция WUNTRACED . |
Аргумент options
управляет поведением вызова. WHOHANG
заставляет функцию немедленно вернуть управление. Если в данный момент нет ни одного процесса, готового сообщить свое состояние, то возвращается 0 вместо допустимого pid. WUNTRACED
заставляет wait4()
возвратить соответствующий остановленный дочерний процесс. Более подробно о приостановленных процессах рассказывается в главе 15. Оба флажка могут быть объединены вместе битовой операцией "или".
Финальный параметр wait4()
, указатель на struct rusage
, наполняется информацией об использовании ресурсов проверяемым процессом и всеми его потомками. Более подробная информация об этом давалась при обсуждении getrusage()
и RUSAGE_BOTH
ранее в главе. Если этот параметр равен NULL
, информация о состоянии не возвращается.
Существуют три других интерфейса к wait4()
, каждый из которых представляет подмножество его функциональности.
pid_t wait(int *status) | Единственный параметр wait() — это указатель на место, куда следует поместить код возврата прерванного процесса. Эта функция всегда блокирует выполнение до тех пор, пока дочерний процесс не будет прерван. |
pid_t waitpid (pid_t pid, int *status, int options) | Функция waitpid() подобна wait4() . Единственное отличие в том, что она не возвращает информации об использовании ресурсов прерванным процессом. |
pid_t wait3(int *status, int options, struct rusage *rusage) | Эта функция также подобна wait4() , но не позволяет специфицировать дочерний процесс, который должен быть проверен. |
10.4.3. Запуск новых программ
Хотя доступно целых шесть способов запустить одну программу из другой, все они делают почти одно и то же — заменяют текущую выполняющуюся программу другой программой. Обратите внимание на слово "fork()
, а затем запустить новую программу из дочернего процесса.
Эти шесть функций лишь слегка отличаются по интерфейсу. Только одна из них — execve()
— является системным вызовом Linux. Остальные реализованы в библиотеках пользовательского пространства и вызывают execve()
для запуска новой программы. Ниже представлены прототипы семейства функций exec()
.
int execl(const char *path, const char *arg0, ...);
int execlp(const char *file, const char *arg0, ...);
int execle(const char *path, const char *arg0, ...);
int execv(const char *path, const char **argv);
int execvp(const char *file, const char **argv);
int execve(const char *file, const char **argv, const char **envp);