Прежде чем написать код, сделаю оговорку, опыт работы с fork() у меня не велик, чтение разных мануалов по fork(), форумов не дало понятия как решить мою проблему.
Вот как я пытаюсь это сделать:
Код: Выделить всё
while(status == "start")
{
//тут никому неинтересный код
// тут вызываю функцию interfaces через форк
int inter_pid(fork()); // в этот момент программа раздваивается и главный процесс получает ID потомка, а потомок получает 0, если все прошло успешно.
if(inter_pid == 0) // т. е. если ты потомок
interfaces(); //выполни функцию interfaces;
//далее опять идет неинтересный код, небольшая отсрочка и все пошло сначала.
}
Функция interfaces заканчивается "exit(0);", используя такой код, все работает, вот только функция interfaces, по окончанию, становится зомби ожидая пока главный процесс спросит: "Ну как там дела в школе? Сегодня получил 0 или 1 или еще что-то получил?" А если родителю плевать на "оценки в школе"? В моем случае это именно так.
Допустим проблему с зомби можно решить вписав где-то в конце цикла wait() или waitpid(), но тогда теряется весь смысл fork(). Мне нужно параллельное выполнение главного процесса и процесса потомка.
Представим ситуацию, "упала" программа, за которой наблюдает основной процесс в цикле и в этот же момент потомок затупил с пингом, ну не может он получить ответ, но пытается. В такой ситуации, если использовать wait или waitpid "упавшая" программа будет поднята только тогда, когда дочерний процесс расскажет "о делах в школе", а если я извращенец и у меня в функции interfaces() при отсутствие пинга запускается компиляция ядра или еще какая-то хрень которая затормозит основной процесс на долгое время? Короче ждать ответа от дочернего процесса — не вариант, зомбаки — опять таки не вариант.
Можно поступить по другому:
Код: Выделить всё
while(status == "start")
{
//тут никому неинтересный код
// тут вызываю функцию interfaces через форк
pid_t inter_pid(fork());
if(inter_pid > 0) // т. е. если ты родитель
interfaces(); //выполни функцию interfaces;
//далее опять идет неинтересный код, небольшая отсрочка и все пошло сначала.
}
В данном случае все работает как по маслу, основной процесс запускает функцию interfaces(), а потомок продолжает основной цикл. Основной процесс завершил функцию interfaces() и закрылся(без зомби и wait), дочерний процесс, который уже стал основным продолжает цикл.
Спасибо всем тем, кто потратил свое время и дочитал до этих строк. Так вот суть вопроса:
1. Нормально ли то, что при использовании последнего кода процесс постоянно "перерождается" и соответственно постоянно меняет свой PID?
2. Есть ли все таки варианты как седлать так, чтобы основной процесс не ждал ответа от дочернего процесса, а продолжал свою работу, а дочерний процесс, в свою очередь, не становился зомби(не люблю мертвых девушек )?
Заранее всех благодарю!