c - 关于waitpid函数的一个疑问
天蓬老师
天蓬老师 2017-04-24 09:09:05
0
1
521

"深入理解计算机系统"一书中的两个例子, 利用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。

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

membalas semua(1)
洪涛

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!