Никакая Ошибка Дочернего процесса от waitpid () при ожидании группы процесса

Нет, я никогда не должен был переписывать. На самом деле я начал использовать Python в 8.5 майя. Перед 8 майя единственный доступный язык сценариев был созданным в MEL (Язык Выражения майя). Python на самом деле быстрее, чем созданный на языке, который он обертывает.

способность Python работать со сложными типами данных также сделала его быстрее, потому что MEL может только сохранить единственные размерные массивы (и никакие указатели). Это потребовало бы, чтобы многомерные массивы фальсифицировались или использующий несколько параллельных массивов, или при помощи медленной конкатенации строк.

7
задан Kyle Brandt 22 October 2009 в 15:26
поделиться

2 ответа

Я игнорировал sigchld со страницы руководства waitpid :

POSIX.1-2001 указывает, что если расположение SIGCHLD установлено на SIG_IGN или флаг SA_NOCLDWAIT установлен для SIGCHLD (см. sigaction (2)), то дети, которые заканчиваются, не стать зомби и призыв ждать () или waitpid () будет блокироваться, пока все дети умерли, а затем сбой с ошибкой, установленной в ECHILD. (The оригинальный стандарт POSIX оставил поведение установки SIGCHLD на SIG_IGN не указан.) Linux 2.6 соответствует этой спецификации. Однако Linux 2.4 (и более ранние версии) нет: если вызов wait () или waitpid () сделано, когда SIGCHLD игнорируется, звонок ведет себя так же, как если бы SIGCHLD не игнорировались, что есть, вызов блокируется до следующего дочерний элемент завершается, а затем возвращает идентификатор процесса и статус этого дочернего процесса.

14
ответ дан 6 December 2019 в 10:51
поделиться

Вам не нужно устанавливать идентификатор группы процессов. По умолчанию дочерний элемент наследует идентификатор родительского объекта как группу. Когда вы ждете, вам нужно дождаться родительского pid:

int main(int argc, char **argv)
{
    pid_t pid;
    int stat;

    if ((pid = fork()))
    {
        printf("PARENT: %d | CHILD: %d\n", getpid(), pid);
        waitpid(-getpid(), &stat, 0);
        printf("DONE: %m\n");
    }
    else
    {
        printf("CHILD: %d\n", getpid());
        sleep(3);
    }
    return 0;
}
2
ответ дан 6 December 2019 в 10:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: