"深入理解计算机系统"一书中的两个例子, 利用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。
Parce que votre processus est
fork
aprèsexit
, cela peut provoquer cette coïncidence, mais si votre programme fait quelque chose. Par exemple, vous pouvez essayer de faire dormir le processus de manière aléatoire pendantn
secondes, puis de le redémarrer, il est donc évidemment peu probable que la première méthode fonctionne.exit