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);
...
Теперь все зомби очищаются автоматически. Помните, что сигнал прерывает вашу текущую программу, вызывает определенный обработчик сигнала и возобновляет работу вашей программы.