【问题标题】:The control flow of this program本程序的控制流程
【发布时间】:2014-10-08 00:29:02
【问题描述】:

我有这个程序可以创建一个孤立进程,但我不太了解它的控制流以及它给出的输出:

#include<stdio.h>
#include<unistd.h>
int main()
{

 pid_t p;

 /* create child process */
p=fork();

 if(p==0) {
    /* fork() returns Zero to child */
    sleep(10);
 }
 printf("The child process pid is %d         parent pid %d\n", getpid(), getppid());

/*parent/child waits for 20 secs and     exits*/
sleep(20);

 printf("\nProcess %d is done its     Parent pid %d...\n", getpid(),     getppid());

 return 0;
}

输出:

shiv@ubuntu:~/ds/unix$ ./a.out
The child process pid is 2575 parent pid 1922

The child process pid is 2576 parent pid 2575

Process 2575 is done its Parent pid 1922...

shiv@ubuntu:~/ds/unix$ 
Process 2576 is done its Parent pid 1...

所以它首先生成“子进程……”,然后休眠 10 秒。并再次执行 'child process blah blah' 。再次看到“父母已经完成......”的事情发生了

即使这个问题看起来很傻,请帮助我。

【问题讨论】:

  • 请解释一下这个程序是如何工作的?
  • 这个程序的哪一部分你不明白?
  • 我不明白,在执行程序时,第一个在 if 语句之后给出第一行,然后休眠 10 秒,然后再次创建一个新的子节点,再次休眠 10 秒,然后执行第二个 printf 语句类似的方式。

标签: c process


【解决方案1】:
  1. 您的程序已启动,创建了一个我们称之为父进程的进程。

  2. fork() 的调用会复制父进程及其整个状态并执行它,从而创建子进程。父进程和子进程现在同时运行。

  3. a) 子进程从fork() 接收到0 作为返回值,因此它休眠10 秒。 b) 父进程从fork()接收子进程的pid作为返回值,当然不等于0;所以父进程不会休眠 10 秒。

  4. 父进程打印"the child process pid is 2575 parent pid 1922"。然后父进程遇到指令休眠 20 秒,就这样做了。

  5. 子进程从 10 秒的睡眠中唤醒。它打印"The child process pid is 2576 parent pid 2575"。之后,子进程遇到指令休眠 20 秒,并这样做。

  6. 父进程从其 20 秒的睡眠中唤醒。它打印"Process 2575 is done its Parent pid 1922...",然后退出。

  7. 子进程从其 20 秒的睡眠中唤醒。它打印"Process 2576 is done its Parent pid 1...",然后退出。但是为什么父 pid 是 1,即使它早于 2575?因为父进程已经退出,导致子进程被init进程孤立,其pid为1。

【讨论】:

    【解决方案2】:

    父母和孩子之间唯一不同的是sleep(10)。所以两个printfs 和sleep(20) 将由孩子和父母执行。但是由于sleep(10),来自子级的 printfs 将在来自父级的相应 printfs 之后延迟 10 秒。

    也就是说第一个printf 具有误导性。应该说

    printf( "my pid is %d and my parent's pid is %d\n", getpid(), getppid() );
    

    在您的示例输出中,子进程是 pid 2576,父进程是 2575,祖父进程是 pid 1922。祖父进程是启动程序的 shell 进程。

    【讨论】:

    • 好的,你的意思是说两个进程同时启动,但是父进程没有进入 if 语句,因为它是 p==1 然后它打印第一个 printf 然后休眠 20 秒孩子完成睡眠并打印第一条语句的时间,然后父母何时终止。
    • @VivekGiri 是的,这就是一般的想法。但是,fork 的返回值为子级的 0 和父级的 2576(使用示例输出中的值)。换句话说,fork 告诉父级新创建的子级的 pid。
    猜你喜欢
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    相关资源
    最近更新 更多