"深入理解计算机系统"一书中的两个例子, 利用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。
Oleh kerana proses anda adalah
fork
selepasexit
, ini mungkin menyebabkan kebetulan ini, tetapi jika program anda melakukan sesuatu. Sebagai contoh, anda boleh cuba membuat proses tidur secara rawak selaman
saat, dan kemudian mulakan semula, jadi kaedah pertama jelas tidak mungkin berfungsi.exit