2016-10-11 3 views
0

Я новичок в процессах в linux и c. Я использую этот простой пример:Цель wait() в родительском c

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main(int argc, const char * argv[]) { 

pid_t child_pid_or_zero = fork(); //fork returns twice 

if(child_pid_or_zero < 0) 
{ 
    //if fork returns a number smaller than zero, something wrong happened 
    perror("Something wrong happened\n"); 
    exit(-1); 
} 

if(child_pid_or_zero > 0) 
{ 
    //if fork returns a number greater than zero, this is the parent process 
    printf("I'm the parent, my pid is: %d\t My child pid is %d\n", getpid(), child_pid_or_zero); 
    wait(NULL); 
} 

else 
{ 
    //this means that fork now returned 0, the child process is running 
    printf("I am the child with pid: %d\t My parent pid is: %d\n",child_pid_or_zero, getppid()); 

} 


return 0; 
} 

Если бы я опускаем ждать() метод в

если (child_pid_or_zero> 0)

Что будет происходить? Я пробовал это сам, и, по-видимому, немедленной разницы не было. Всегда ли нужно использовать wait(), или это применимо только тогда, когда ребенок должен выполнять тяжелые вычисления и т. Д.?

Заранее спасибо.

+0

https://en.wikipedia.org/wiki/Orphan_process –

+0

http://stackoverflow.com/questions/23709888/how-to-use-wait-in-c – SMW

+0

при компиляции всегда включайте все предупреждения, затем исправить эти предупреждения. – user3629249

ответ

4

Ждать для прослушивания изменений состояния и получения информации о ребенке. Изменение состояния - это прекращение ребенка, остановка или возобновление сигнала. Wait позволяет системе освобождать ресурсы, связанные с дочерним элементом. Если ожидание не выполняется, то завершенный ребенок остается в состоянии «зомби».

Ядро поддерживает минимальный набор информации о процессе зомби (PID, статус завершения, информация об использовании ресурсов) для того, чтобы позволить родителю позже выполнить ждать, чтобы получить информацию о ребенке. Поскольку как зомби не удаляется из системы через , то он будет использовать слот в таблице процессов ядра, и если эта таблица будет заполнена, невозможно будет создать дополнительные процессы . Если родительский процесс завершается, то его «зомбированные» дети (если они есть) принимаются init (1), что автоматически выполняет ожидание для удаления зомби.

+0

не совсем корректно. 1) пользователь не может убить зомби, кроме повторной загрузки. 2) процесс 'init' не будет выполнять' wait() ', поэтому зомби будет навсегда или до перезагрузки – user3629249

+0

процесс зомби создается, когда его родительский выход завершается, поэтому родительский элемент (который больше не существует)) не может удалить его. Зомби становится ребенком процесса 'init' и остается навсегда – user3629249

2

Системный вызов wait(2) обычно используется, чтобы найти, если состояние дочернего процесса изменилось (т.е. является ли он все еще работает, вышел, и т.д.).

Другая цель - избегать процессов "zombie". Если родительский процесс не ждет дочернего процесса, а дочерний процесс завершается до родительского процесса, он становится процессом «зомби». Таким образом, вызов wait() используется для «пожинания» процесса и освобождения системных ресурсов, связанных с процессом.

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

+0

Можете ли вы подробнее рассказать? Как предоставить пример, где это может привести к этим зомби? – Koen

+1

Это довольно просто сделать в вашем примере. В родительском процессе ('if hild_pid_or_zero> 0)' part) добавьте 'sleep (10);' в качестве первого оператора. Затем выполните свой код и в другом окне терминала, если вы запустите 'ps -af', вы увидите процесс зомби (потому что родитель еще не получил его, а дочерний процесс уже вышел). – usr

1

после вилки у вас будет два независимых процесса.

с вызовом wait(), вы указываете родительскому процессу ждать завершения дочернего процесса.

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

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

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