LINUX.ORG.RU

Что имели в виду авторы?

 , , ,


0

1

... вот здесь: 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 больше нигде не используется. Вот и вопрос: это они таким хитрым образом от зомби избавляются или имеется в виду ещё что-нибудь?

★★★★★

Из-за наличия семофора можно было подумать, что они ожидают завершения нового процесса, но, вроде, нет. Да и для этого есть другой способ. Похоже, что это просто для целей логирования (максимум одного дочернего процесса...). Никакого сакрального смысла я не вижу.

xaizek ★★★★★ ()

Как уже сказали выше, просто дебажные логи.

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

только оно же все логи забивает сообщениями типа «child_signal_handler: child pid 0» удивительно, что в этом кто-то видит смысл)

asaw ★★★★★ ()
Последнее исправление: asaw (всего исправлений: 1)
Ответ на: комментарий от asaw

Ну если там WNOHANG внутри и он получается крутится в цикле долго, то это изврат.

xaizek ★★★★★ ()

это они таким хитрым образом от зомби избавляются

Разверни мысль, пожалуйста, как это может избавить.

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

Очень просто. Если ты запустишь процесс, он завершится, но ты не считаешь его статус, то он останется зомби. Вызов waitpid() как раз и считывает этот статус. Но от зомби в юниксах можно избавляться гораздо проще: достаточно просто установить игнорирование для сигнала SIGCHLD через sigaction();

asaw ★★★★★ ()
Последнее исправление: asaw (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.