... вот здесь: https://github.com/neutrinolabs/xrdp/blob/master/sesman/chansrv/chansrv.c
int g_exec_pid = 0; //< глобальная переменная
int APP_CC
g_waitchild(void)
{
int wstat;
int rv;
rv = waitpid(0, &wstat, WNOHANG);
if (rv == -1)
{
if (errno == EINTR) /* signal occurred */
{
rv = 0;
}
}
return rv;
}
void DEFAULT_CC
child_signal_handler(int sig) //< обработчик SIGCHLD
{
int pid;
LOG(0, ("child_signal_handler:"));
do
{
pid = g_waitchild();
LOG(0, ("child_signal_handler: child pid %d", pid));
if ((pid == g_exec_pid) && (pid > 0))
{
LOG(0, ("child_signal_handler: found pid %d", pid));
}
}
while (pid >= 0);
}
static int APP_CC
run_exec(void)
{
int pid;
LOG(10, ("run_exec:"));
pid = g_fork();
if (pid == 0)
{
trans_delete(g_con_trans);
g_close_wait_obj(g_term_event);
g_close_wait_obj(g_thread_done_event);
g_close_wait_obj(g_exec_event);
tc_mutex_delete(g_exec_mutex);
tc_sem_delete(g_exec_sem);
g_execlp3(g_exec_name, g_exec_name, 0); //< это - просто execlp
g_exit(0);
}
g_exec_pid = pid;
tc_sem_inc(g_exec_sem);
return 0;
}
...при этом g_exec_pid больше нигде не используется. Вот и вопрос: это они таким хитрым образом от зомби избавляются или имеется в виду ещё что-нибудь?