Как родительский процесс преобразует код завершения дочернего процесса в код состояния? - PullRequest
0 голосов
/ 27 февраля 2020

Когда я запускаю следующий код (заголовки и основная запись опущены)

void fork11()
{
    pid_t pid[N];
    int i;
    int child_status;

    for (i = 0; i < N; i++)
    if ((pid[i] = fork()) == 0)
        exit(100+i); /* Child */
    for (i = N-1; i >= 0; i--) {
        pid_t wpid = waitpid(pid[i], &child_status, 0);
        if (WIFEXITED(child_status)) {
            printf("Child %d terminated with exit status %d\n", wpid, WEXITSTATUS(child_status));
            printf("child_status: %d\n", child_status);
        } else {            
            printf("Child %d terminate abnormally\n", wpid);
        }    
    }
}

результат равен

Child 5126 terminated with exit status 104
child_status: 26624
Child 5125 terminated with exit status 103
child_status: 26368
Child 5124 terminated with exit status 102
child_status: 26112
Child 5123 terminated with exit status 101
child_status: 25856
Child 5122 terminated with exit status 100
child_status: 25600

с некоторыми копаниями я нахожу WEXITSTATUS простой макрос

#define WEXITSTATUS(x) ((_W_INT(x) >> 8) & 0x000000ff)

возьмите дочерний процесс 5126, например, waitpid преобразует 104 в 26624=0x6800, WEXITSTATUS преобразует 26624 обратно в 104=0x68, я пытался поищите исходный код waitpid, но в итоге у меня появились некоторые функции ядра , которые я не могу понять ... кто-нибудь может объяснить немного, как waitpid преобразует код выхода? В приведенном выше примере это кажется довольно простым, но я думаю, что это намного больше, спасибо!

1 Ответ

0 голосов
/ 27 февраля 2020

Когда процесс завершается, возвращаемое значение, переданное функции exit(), используется в качестве параметра для фактического int (4 байта), передаваемого любому процессу, который его ожидает. В дополнение к 8 битам этого кода состояния передается дополнительная информация.

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

Как видно здесь о WEXITSTATUS:

Он состоит из наименее значимых 8 битов аргумента состояния, который дочерний элемент указал в вызове на exit(3) ...

Это означает, что процессы не могут завершиться с кодами, которые требуют более 8 бит.

...