Rumah > Soal Jawab > teks badan
"深入理解计算机系统"一书中的两个例子, 利用waitpid函数回收僵死子进程。
#include "csapp.h"
#define N 30
int main()
{
int status, i;
pid_t pid;
for (i = 0; i < N; i++)
if ((pid = Fork()) == 0)
exit(100+i);
while ((pid = waitpid(-1, &status, 0)) > 0) {
if (WIFEXITED(status))
printf("child %d terminated normally with exit status=%d\n",
pid, WEXITSTATUS(status));
else
printf("child %d terminated abnormally\n", pid);
}
if (errno != ECHILD)
unix_error("waitpid error");
exit(0);
另一个程序对这个程序稍作改动:
#include "csapp.h"
#define N 30
int main()
{
int status, i;
pid_t pid[N], retpid;
for (i = 0; i < N; i++)
if ((pid[i] = Fork()) == 0)
exit(100+i);
i = 0;
while ((retpid = waitpid(pid[i++], &status, 0)) > 0) {
if (WIFEXITED(status))
printf("child %d terminated normally with exit status=%d\n",
retpid, WEXITSTATUS(status));
else
printf("child %d terminated abnormally\n", retpid);
}
if (errno != ECHILD)
unix_error("waitpid error");
exit(0);
}
书上说第一个程序不会按照创建进程的顺序回收僵死进程,而第二个会。然而我实验的结果却是两者都是按创建顺序回收的,为什么会这样?环境是ubuntu。
PHP中文网2017-04-24 09:11:05
Oleh kerana proses anda adalah fork
selepas exit
, ini mungkin menyebabkan kebetulan ini, tetapi jika program anda melakukan sesuatu. Sebagai contoh, anda boleh cuba membuat proses tidur secara rawak selama n
saat, dan kemudian mulakan semula, jadi kaedah pertama jelas tidak mungkin berfungsi. exit