2015-09-08 7 views
0

См код ниже:смерти Родитель не убивает ребенок proess в программе C Linux

#include<stdio.h> 

void main() 
{ 
     int pid = fork(); 
     if(pid==0) 
     { 
       while(1); 
     } 
     else 
     { 
       while(1); 
     } 
} 

Выполнить этот код из терминала 1:

Перейти к зажиму 2 и проверить процессы на терминале 1:

[email protected]:~$ ps -ft /dev/pts/1 
UID  PID PPID C STIME TTY   TIME CMD 
hduser 3824 3505 0 17:20 pts/26 00:00:00 bash 
hduser 4007 3824 21 17:33 pts/26 00:00:01 ./a.out 
hduser 4008 4007 22 17:33 pts/26 00:00:02 ./a.out 
[email protected]:~$ 

Два a.out работает здесь. Теперь убейте родителю 4007.

[email protected]:~$ kill -9 4007 
[email protected]:~$ ps -ft /dev/pts/26 
UID  PID PPID C STIME TTY   TIME CMD 
hduser 3824 3505 0 17:20 pts/26 00:00:00 bash 
hduser 4008 2077 24 17:33 pts/26 00:00:29 ./a.out 
[email protected]:~$ 

Примечание 4008 все еще работает, и теперь ребенок 2077 (INIT --user).

Моего Сомнения:

  1. Почему ребенок не погиб от родителей до смерти родителей?
  2. Обычно, если мы запускаем какой-либо процесс из терминала (bash) без «nohup» и убиваем bash, тогда убивается ребенок bash. Как реализовать это поведение в нашей программе на C?
  3. Я думал, что поведение по умолчанию состоит в том, что родитель убивает своего ребенка до смерти, и мы должны вызвать wait(), чтобы преодолеть это поведение. Но я был неправ. Тогда какая цель wait()?

Я использую Ubuntu 14 с ядром 3.13.0-52.

+1

В linux дочерний процесс не убивается, когда родитель умирает. – sreeyesh

+1

Почему * должен * убить дочерний процесс при выходе родителя? Такого рода побеждает цель изолированных и независимых процессов. –

+0

Сделайте дочерний процесс демоном, иначе он будет принят процессом init после завершения его родительского контура. –

ответ

0

В linux дочерний процесс не убивается, когда родитель умирает.

Вы можете написать обработчик сигнала для родителя и в этом обработчике сигнала вы можете вызвать API, чтобы убить дочерний процесс.

Ожидается, что системный вызов вызван из родительского процесса, чтобы приостановить его, пока один из его дочерних элементов не завершится. В противном случае ребенок станет зомби-процессом.

2

В системе Linux/UNIX процесс не умирает, если он не выйдет или явно не убит каким-либо другим процессом.

Что такое системный вызов wait, приостанавливает процесс до тех пор, пока не закончится один из его дочерних процессов. Вы также можете позвонить waitpid, который ждет, пока определенный дочерний процесс умрет.

Если процесс имеет управляющий терминал и терминал завершает работу, любой процесс под этим управляющим терминалом будет удален ОС. Вы можете использовать системный вызов setsid, чтобы отсоединить процесс от управляющего терминала, чтобы он мог жить в фоновом режиме даже после выхода пользователя из системы.

+0

Не убит, отправлен 'SIGHUP'. Вот почему «nohup» работает в этих случаях. – Petesh

+0

#include #include void main() { int pid = fork(); if (pid == 0) { execlp ("gedit", "gedit", NULL); } else { // wait(); }} убить -9 PID из a.out -> Только a.out убит не GEdit –

+0

# include # include силы основных() {INT PID = вилка(); if (pid == 0) {execlp ("gedit", "gedit", NULL); } else {// wait(); }} kill -9 pid a.out -> Только a.out убил не gedit. Для ctrl + c -> оба убиты. Если мы закроем терминал, оба будут убиты. Для нормального завершения a.out без wait() убит только a.out. Что именно происходит? –

 Смежные вопросы

  • Нет связанных вопросов^_^