Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Функции
execerrnoexecНовые процессы, запущенные exec, наследуют многие свойства исходного процесса. В частности, открытые файловые дескрипторы остаются открытыми в новом процессе, пока не установлен их флаг
FD_CLOEXECfcntlДублирование образа процесса
Для применения процессов, выполняющих несколько функций одновременно, можно либо использовать потоки, обсуждаемые в главе 12, либо создавать в программе полностью отдельный процесс, как делает
initexecСоздать новый процесс можно с помощью вызова
forkexecfork<b>#include <sys/types.h></b><b>#include <unistd.h></b><b>pid_t fork(void);</b>Как видно из рис. 11.2, вызов
forkfork
Рис. 11.2
Если вызов
forkCHILD_MAXerrnoEAGAINerrnoENOMEMДалее приведен фрагмент типичного программного кода, использующего вызов
forkpid_t new_pid;new_pid = fork();switch(new_pid) {case -1: /* Ошибка */ break;case 0: /* Мы — дочерний процесс */ break;default: /* Мы — родительский процесс */ break;}Выполните упражнение 11.3.
forkДавайте рассмотрим простой пример fork1.с:
#include <sys/types.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>int main() { pid_t pid; char* message; int n; printf("fork program startingn"); pid = fork(); switch(pid) { case -1: perror("fork failed"); exit(1); case 0: message = "This is the child"; n = 5; break; default: message = "This is the parent"; n = 3; break; } for (; n > 0; n--) { puts(message); sleep(1); } exit(0);}Эта программа выполняет два процесса. Дочерний процесс создается и выводит пять раз сообщение. Исходный процесс (родитель) выводит сообщение только три раза. Родительский процесс завершается до того, как дочерний процесс выведет все свои сообщения, поэтому в вывод попадает очередное приглашение командной оболочки.
$ <b>./fork1</b>fork program startingThis is the childThis is the parentThis is the parentThis is the childThis is the parentThis is the child$ This is the childThis is the childКак это работает
Когда вызывается
forkforkОжидание процесса
Когда вы запускаете дочерний процесс с помощью вызова
forkwait
