Форк, совместное использование переменных и обработка зомби-процессов

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

  1. Если у меня есть глобальные переменные, родитель и все дети работают с одной и той же «копией» этих глобальных переменных? Если нет, могу ли я как-то их доставить (vfork?)?

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

  3. Возможно, полностью обойдя вопрос 2, поскольку меня на самом деле не волнуют результаты дочерних процессов, есть ли способ заставить их вообще не оставлять зомби? Я видел кое-что о signal(SIGCHLD, SIG_IGN), но я не уверен, как его использовать, а найденная мной справочная страница для него была несколько тупой.


person Oblivious Sage    schedule 12.02.2012    source источник
comment
Для 1) Глобальные переменные являются общими. Вот где вам нужно увидеть синхронизированный доступ к этим переменным между различными потоками.   -  person Mahesh    schedule 13.02.2012
comment
Разветвление создает новый, независимый, автономный процесс. Может быть, вы имели в виду потоки?   -  person Kerrek SB    schedule 13.02.2012
comment
@Mahesh После разветвления все глобальные переменные (и локальные в функции, выполнившей разветвление) одинаковы, но они не являются общими. Родительский и дочерний процессы должны взаимодействовать через некоторый тип IPC.   -  person Some programmer dude    schedule 13.02.2012
comment
@JoachimPileborg: Мууу.... :-)   -  person Kerrek SB    schedule 13.02.2012


Ответы (2)


1) Если у меня есть глобальные переменные, работают ли родитель и все дочерние элементы с одной и той же «копией» этих глобальных переменных? Если нет, есть ли способ заставить их (vfork?)?

Стек будет скопирован полностью. Скопировано, не передано. Таким образом, если вы хотите, чтобы ваш родитель и ребенок общались, вы должны использовать сокеты или общую память. Или нити.

Пропускаю вопрос 2:

3) Возможно, полностью обойти вопрос 2, поскольку меня на самом деле не волнуют результаты дочерних процессов, есть ли способ заставить их вообще не оставлять зомби? Я видел кое-что о сигнале (SIGCHLD, SIG_IGN), но я не уверен, как его использовать, и человек, которого я нашел, был несколько... тупым.

В POSIX вы можете использовать специальные сигналы для своей программы. Например, ctrl+c отправит сигнал прерывания (SIGINT), который завершит вашу программу, если вы не определили обработчик SIGINT.

SIGCHLD — это сигнал, который ваша программа получает, если завершается дочерний процесс. По умолчанию игнорируется. Ну, а почему бы нам не написать себе маленький обработчик сигналов? Обработчик сигнала — это функция void с аргументом int в качестве единственного:

void cleanup_child(int signal) {
    wait();
}

Теперь зарегистрируйте обработчик сигнала в самом начале вашей основной функции, и все готово:

int main(...){
    signal(SIGCHLD,cleanup_child);
    ...

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

person Zeta    schedule 12.02.2012

1) Два процесса не используют общие глобальные переменные.

2) использование waitid (2) может вам помочь. Смотри, мужик.

Если родительский процесс завершается раньше дочернего, то дочерний получает нового родителя - процесс с PID=1, т.е. init. Если ребенок зомби, init автоматически решает эту проблему.

person mikithskegg    schedule 12.02.2012
comment
1) абсолютно неверно; разветвленные процессы не используют общие переменные: каждый процесс имеет свою собственную копию переменной и не может читать значение другой - person tbert; 13.02.2012