Intereting Posts
Легкий и легкий в установке Удалить обратную косую черту + последовательности новой строки UNIX вставляют столбцы и вставляют нули для всех отсутствующих значений Чтение из брелка не выполнено с ошибкой: «Нет доступной службы брелка» Пропустить stdin в качестве аргумента для скрипта bash Автоматизация резервных копий выполняется из сценария bash в Linux правильным способом Как реализовать условное обновление пакета deb Эффект LVM влияет на производительность? tcsh, чтобы переместить курсор обратно в предыдущее пространство Исключение разрешения на файл устройства (RHEL 6.1) Отмененная операция GParted; не «Отменить»; Как мне выйти без потери данных? Ждите программы в чистом виде (например, в другом окне терминала) Как удалить файлы с пробелами в них в сценарии bash? ubuntu не запускается после обновления-grub Разделить физический X-дисплей на два виртуальных дисплея?

Неожиданный родительский идентификатор процесса на выходе

Мой код разворачивает процесс и печатает каждый процесс «PID и PPID». Я ожидал, что PPID у ребенка будет таким же, как у PID родителя, но он не подходит как таковой.

Я использую Ubuntu 14.04.

#include <stdio.h> #include <sys/wait.h> int main(){ int pid; pid = fork(); if(pid==0){ printf("\nI am the child and my parent id is %d and my id %d\n", getppid(), getpid()); } else printf("\nI am the parent and my pid is %d and my parent id is %d\n", getpid(), getppid()); return 0; } 

Вот результат, который я получаю:

 I am the parent and my pid is 29229 and my parent id is 27087 I am the child and my parent id is 1135 and my id is 29230 

Я предполагаю, что родитель вернулся перед ребенком, который стал сиротой. PID 1135 должен быть вашим процессом инициализации пользователя, который стал процессом нового родителя. (в пользовательском сеансе Ubuntu есть 2 подпотребителя).

 $ ps -ef | grep init you 1135 ... init --user 

Если вы хотите, чтобы ваш родитель подождал своего ребенка, используйте wait . На самом деле у вас уже есть include :

 #include <stdio.h> #include <sys/wait.h> int main(){ int pid; pid = fork(); if(pid == 0) printf("\nI am the child and my parent id is - %d and mine id %d\n",getppid(),getpid()); else{ printf("\nI am the parent and my pid is %d and my parent id is %d\n",getpid(),getppid()); wait(NULL); } return 0; } 

Это гарантирует, что родительский элемент не будет удален до printf . Вы можете увидеть это поведение более четко, вставив несколько вызовов sleep() здесь и там, чтобы увидеть, в каком порядке происходят события.

Для получения дополнительной информации о подводных лодках, посмотрите здесь .