c - 本程序的控制流程

标签 c process

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

#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 秒。并再次执行“子进程等等”。再次看到“ parent 完成了......”的事情发生了

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

最佳答案

  1. 您的程序已启动,创建一个我们称为父进程的进程。

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

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

  4. 父进程打印“子进程pid为2575父pid 1922”。然后父进程遇到休眠 20 秒的指令,就会这样做。

  5. 子进程从 10 秒的 sleep 中醒来。它打印“子进程pid是2576父进程pid 2575”。之后,子进程遇到休眠 20 秒的指令,就会这样做。

  6. 父进程从 20 秒的 sleep 中醒来。它打印“进程 2575 已完成其父进程 pid 1922...”,然后退出。

  7. 子进程从 20 秒的 sleep 中醒来。它打印“进程 2576 已完成其父进程 pid 1...”,然后退出。但是为什么父进程 pid 是 1,尽管之前是 2575?因为父进程已经退出,导致子进程被pid为1的init进程孤立。

关于c - 本程序的控制流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26247409/

相关文章:

objective-c - 10.4 中的内部和外部 IP 地址

C 题——用[]代替*?

c# - 为什么处理输出阅读器返回空数据?当其他进程中的相同代码正常工作时

bash - Bash Shell 的新应用程序

java - 字节数组作为外部程序的标准输入/输出。

c++ - 用于即时提取 zip 的库

c - 在 main() 中定义一个函数

c++ - 无法删除 Visual Studio 中的链接器错误

linux - 为什么进程之间不能直接通信?

c - 当多线程程序创建新进程时会发生什么?