Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
Обратите внимание, что этот макрос не стандартный. Системы GNU/Linux, Solaris и BSD его поддерживают, однако некоторые другие системы Unix нет. Поэтому и здесь, если нужно его использовать, заключите код внутрь '
#ifdef WCOREDUMP ... #endifБольшинство программ не интересуются, почему завершился порожденный процесс; им просто нужно, что он завершился, возможно, отметив, было завершение успешным или нет. Программа GNU Coreutils
installfork()execlp()wait()-sinstallstrip(stripstripstrip()install.с513 /* Вырезать таблицу имен из файла PATH.514 Мы могли бы сначала вытащить из файла магическое число515 для определения, нужно ли вырезать, но заголовочные файлы и516 магические числа варьируют от системы к системе так сильно, что517 сделать его переносимым было бы очень трудно. Не стоит усилий. */518519 static void520 strip (const char *path)521 {522 int status;523 pid_t pid = fork();524525 switch (pid)526 {527 case -1:528 error(EXIT_FAILURE, errno, _("fork system call failed"));529 break;530 case 0: /* Порожденный. */531 execlp("strip", "strip", path, NULL);532 error(EXIT_FAILURE, errno, _("cannot run strip"));533 break;534 default: /* Родитель. */535 /* Родительский процесс. */536 while (pid != wait(&status)) /* Ждать завершения потомка. */537 /* Ничего не делать. */ ;538 if (status)539 error(EXIT_FAILURE, 0, _("strip failed"));540 break;541 }542 }Строка 523 вызывает
fork()switchСтиль строк 536–537 типичен; они ожидают завершения нужного порожденного процесса. Возвращаемое значение wa
it()statusif (WIFEXITED(status) && WEXITSTATUS(status) != 0)Из описаний и кода, представленных до сих пор, может показаться, что родительские программы должны выбрать определенный момент, чтобы ожидать завершения любого порожденного процесса, возможно, с опросом в цикле (как делает
install.c9.1.6.2. Использование функций BSD:
wait3()wait4()Системные вызовы BSD
wait3()wait4()#include <sys/types.h> /* Обычный */#include <sys/time.h> /* Под GNU/Linux не нужно, но улучшает переносимость */#include <sys/resource.h>#include <sys/wait.h>pid_t wait3(int *status, int options, struct rusage *rusage);pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);Переменная
statuswait()waitpid()WIFEXITED()Значение
optionswaitpid()WNOHANGWUNTRACEDwait3()wait()wait4()waitpid()WNOHANGpidpidwaitpid()Ключевым отличием является указатель
struct rusageNULL