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

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

天蓬老师
天蓬老师

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

모든 응답(1)
洪涛

당신의 프로세스가 fork 이후 exit이기 때문에 이것이 우연의 일치를 일으킬 수도 있지만, 당신의 프로그램이 뭔가를 한다면 말이죠. 예를 들어, n초 동안 프로세스를 무작위로 절전 모드로 설정한 다음 다시 시작하려고 시도할 수 있으므로 첫 번째 방법은 작동하지 않을 가능성이 높습니다. exit

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!