LINUX.ORG.RU

Синхронизация процессов при fork()


0

0

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

Сейчас я ставлю обработчик SIGCHLD, смотрю на pid завершившегося процесса и нахожу доп. инфу о процессе в списке дочерних процессов. Вся проблема в том, что если дочерний процесс очень быстро закончится, то его код сохранения pid'а в таблице (т.е. кусок сразу после fork) будет выполнен после обработчика SIGCHLD, который соответственно не найдет инфы в таблице.

Как лечить?

clone(CLONE_PARENT_SETTID, ptr_to_the_child_pid) instead of fork(), or

sigprocmask(SIG_BLOCK, {SIGCHLD});
pid = fork();
add_to_database(pid);
sigprocmask(SIG_UNBLOCK, {SIGCHLD});

idle ★★★★★
()
Ответ на: комментарий от idle

> sigprocmask(SIG_BLOCK, {SIGCHLD}); pid = fork(); add_to_database(pid); sigprocmask(SIG_UNBLOCK, {SIGCHLD});

а почему блокирование сигнала SIGCHLD запретит ребенку завершиться??

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

surely the blocked SIGCHLD can't prevent the child
from exiting. but it blocks the signal until the
parent adds the pid to its internal database.

this means that the signal handler won't be confused
seeing the unregistered pid.

idle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.