无法理解代码的输出

时间:2017-10-18 20:06:54

标签: c process waitpid

我编写了以下代码并运行了几次。但每次结果都不同。

#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
int main(int argc, char **argv) {
  pid_t id;
  int status; 
  while (--argc && (id=fork())) {
    waitpid(id,&status,0); /* Wait for child*/
  }
  printf("%d:%s\n", argc, argv[argc]);
  return 0;
}

我跑得像:

./a.out 1 2 3

然后有时我得到了:

3: 3
2: 2
1: 1
0: ./a.out
$ 0: ./a.out  (It seems still running, waiting for my input)

有时候我得到了:

3: 3
$ 3: 3 (It seems still running, waiting for my input)

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

功能:fork()可以将pid设置为三种不同含义中的任何一种:

  1. -1表示发生了错误。
  2. =0表示当前正在运行子进程。
  3. >0表示当前正在运行父进程。
  4. 因此父级根据命令行参数的数量分配子级。然后等待每个连续的孩子退出。

    每个子进程执行printf()函数然后退出

    最后,父级执行printf()函数,argc为0

    注意:代码应该是从waitpid()

    的调用中检查返回的值

    注意:代码应该检查变量id&gt; 0以确保对fork()的呼叫成功。实际上,该调用失败(返回-1)将导致调用waitpid()永远等待,因为没有子进程等待

    这是一对示例rund,其中untitled1是可执行文件的名称

    rkwill@richard-desktop:~/Documents/forum$ ./untitled1 1 2 3
    3:3
    2:2
    1:1
    0:./untitled1
    rkwill@richard-desktop:~/Documents/forum$ ./untitled1 
    0:./untitled1
    rkwill@richard-desktop:~/Documents/forum$ 
    

    从上面可以看出,当给定参数时,它会以相反的顺序列出它们,然后列出argv[0]

    如果没有参数,它仍会列出argv[0]