Форк, разделение переменных и обработка процессов зомби - PullRequest
2 голосов
/ 13 февраля 2012

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 13 февраля 2012

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

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

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

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

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

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

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

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

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

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

1 голос
/ 13 февраля 2012

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

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

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

...