Когда я запускаю следующий код (заголовки и основная запись опущены)
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
преобразует код выхода? В приведенном выше примере это кажется довольно простым, но я думаю, что это намного больше, спасибо!