跟踪进程的执行情况

时间:2016-02-07 08:10:03

标签: c process fork creation

我有这个代码获取其进程ID及其父进程:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(){
int pid;
printf("I am the original process with PID %d and PPID %d. \n", getpid(), getppid());
pid = fork();

if (pid >0){
    printf("I am the original process with PID %d and PPID %d \n", getpid(), getppid());
    printf("My child’s pid is %d \n" , pid);
}
else if(pid == 0) {
    printf ("I am the original process with PID %d and PPID %d \n", getpid(), getppid());
}
else if (pid == 1){
    printf ("Error – no child process was created \n");
}else{
    printf ("Error – system error \n");
}
    printf (" PID %d terminates \n", getpid()); /* both processes execute this instruction */

return 0;
}

输出

I am the original process with PID 1009 and PPID 964. 
I am the original process with PID 1009 and PPID 964 
My child’s pid is 1010 
 PID 1009 terminates 
I am the original process with PID 1010 and PPID 1009 
 PID 1010 terminates 

几个令我困惑的问题...... 这段代码是如何执行的? 在输出中,您可以看到它在if(pid == 0)下运行代码,而条件if(pid > 0)已经执行。为什么pid等于0?虽然它已经设置为大于0。 最后,fork()真正做了什么?

1 个答案:

答案 0 :(得分:2)

fork()创建多个进程,或者#34; child&#34;。所以父和子执行代码。父母的pid是&gt; 0,孩子是== 0。

因此,父和子在fork命令开始的相似时间执行。所以,让我们从父母开始吧。父检查第一个语句(pid> 0)并发现它为true,因此它打印出两个语句。然后它会在最后一个之后一直到print语句。

现在给孩子。子进程检查第一个if语句,并且为false。检查下一个(pid == 0)并发现它是真的。所以现在它打印出那个声明。现在它将在else之后跳转到print语句并再次打印。

注意:父级和子级可以在不同的时间执行,因此如果多次运行代码,则输出的顺序可能不同。