我有这个代码获取其进程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()
真正做了什么?
答案 0 :(得分:2)
fork()创建多个进程,或者#34; child&#34;。所以父和子执行代码。父母的pid是&gt; 0,孩子是== 0。
因此,父和子在fork命令开始的相似时间执行。所以,让我们从父母开始吧。父检查第一个语句(pid> 0)并发现它为true,因此它打印出两个语句。然后它会在最后一个之后一直到print语句。
现在给孩子。子进程检查第一个if语句,并且为false。检查下一个(pid == 0)并发现它是真的。所以现在它打印出那个声明。现在它将在else之后跳转到print语句并再次打印。
注意:父级和子级可以在不同的时间执行,因此如果多次运行代码,则输出的顺序可能不同。