Помогите понять. Есть программа, в цикле опрашивает состояние других программ дабы следить за порядком "на корабле", к этой программе нужно добавить ответвление, которое будет вызываться в определенный момент как функция и проверять сетевые интерфейсы, делать пинги, принимать решения и по окончанию процесса, просто закрываться. Короче говоря, все это лирика главное то, что программа должна создать дочерний процесс и забыть про него, процесс выполнился и исчез.
Прежде чем написать код, сделаю оговорку, опыт работы с fork() у меня не велик, чтение разных мануалов по fork() не дало понятия как решить мою проблему.
Так вот как я пытаюсь это сделать:
while(status == "start")
{
//тут никому неинтересный код
// тут вызываю функцию interfaces через форк
int inter_pid(fork()); // в этот момент программа раздваивается и главный процесс получает ID потомка, а потомок получает 0, если все прошло успешно.
if(inter_pid == 0) // т. е. если ты потомок
interfaces(); //выполни функцию interfaces;
//далее опять идет неинтересный код, небольшая отсрочка и все пошло сначала.
}
Функция interfaces заканчивается "exit(0);", используя такой код, все работает, вот только функция interfaces, по окончанию, становится зомби ожидая пока главный процесс спросит: "Ну как там дела в школе? Сегодня получил 0 или 1 или еще что-то получил?" А если родителю плевать на "оценки в школе"?
![2funny :2funny:](https://forum.ubuntu.ru/Smileys/webby/2funny.gif)
В моем случае это именно так.
Допустим проблему с зомби можно решить вписав где-то в конце цикла 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. Есть ли все таки варианты как седлать так, чтобы основной процесс не ждал ответа от дочернего процесса, а продолжал свою работу, а дочерний процесс, в свою очередь, не становился зомби(не люблю мертвых девушек
![Grin ;D](https://forum.ubuntu.ru/Smileys/webby/grin.gif)
)?
Заранее всех благодарю!