Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Функции
exec
errno
exec
Новые процессы, запущенные exec, наследуют многие свойства исходного процесса. В частности, открытые файловые дескрипторы остаются открытыми в новом процессе, пока не установлен их флаг
FD_CLOEXEC
fcntl
Дублирование образа процесса
Для применения процессов, выполняющих несколько функций одновременно, можно либо использовать потоки, обсуждаемые в главе 12, либо создавать в программе полностью отдельный процесс, как делает
init
exec
Создать новый процесс можно с помощью вызова
fork
exec
fork
<b>#include <sys/types.h></b>
<b>#include <unistd.h></b>
<b>pid_t fork(void);</b>
Как видно из рис. 11.2, вызов
fork
fork
Рис. 11.2
Если вызов
fork
CHILD_MAX
errno
EAGAIN
errno
ENOMEM
Далее приведен фрагмент типичного программного кода, использующего вызов
fork
pid_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 starting
This is the child
This is the parent
This is the parent
This is the child
This is the parent
This is the child
$ This is the child
This is the child
Как это работает
Когда вызывается
fork
fork
Ожидание процесса
Когда вы запускаете дочерний процесс с помощью вызова
fork
wait