Дочерний процесс не будет самоубийством, если родитель умрет
У меня есть подпроцесс (работающий на MacOS), который я хочу убить сам, если родительский процесс завершается, выходит, завершается, уничтожается или падает. Следуя совету Как заставить ребенка умирать после выхода из родительского процесса? Я не могу заставить его тихо убить себя, если родительская программа падает. Он перейдет на 100% CPU, пока я не убью его вручную.
Вот ключевые моменты кода:
int main(int argc, char *argv[])
{
// Catch signals
signal(SIGINT, interruptHandler);
signal(SIGABRT, interruptHandler);
signal(SIGTERM, interruptHandler);
signal(SIGPIPE, interruptHandler);
// Create kqueue event filter
int kqueue_fd = kqueue();
struct kevent kev, recv_kev;
EV_SET(&kev, parent_pid, EVFILT_PROC, EV_ADD|EV_ENABLE, NOTE_EXIT, 0, NULL);
kevent(kqueue_fd, &kev, 1, NULL, 0, NULL);
struct pollfd kqpoll;
kqpoll.fd = kqueue_fd;
kqpoll.events = POLLIN;
// Start a run loop
while(processEvents())
{
if(kill(parent_pid, 0) == -1)
if(errno == ESRCH)
break;
if(poll(&kqpoll, 1, 0) == 1)
if(kevent(kqueue_fd, NULL, 0, &recv_kev, 1, NULL))
break;
parent_pid = getppid();
if(parent_pid == 1)
break;
sleep(a_short_time);
// (simple code here causes subprocess to sleep longer if it hasn't
// received any events recently)
}
}
1 ответ
Отвечая на мой собственный вопрос здесь:
Причина этой проблемы была не в том, чтобы определить, умер ли родительский процесс. В processEvents()
Я опрашивал канал из родительского процесса, чтобы узнать, было ли какое-либо сообщение. Когда родитель умер, poll()
вернул значение 1, и цикл чтения подумал, что бесконечные данные ожидают чтения.
Решением было определить, была ли отсоединена труба или нет.