Linux 在程序中使用fork时的执行
当我尝试以下程序时,我正在阅读关于fork()的内容。我无法理解以下命令的输出,但如果删除第二个fork()调用,我可以了解它的作用。请给我解释一下以下程序的流程Linux 在程序中使用fork时的执行,linux,fork,Linux,Fork,当我尝试以下程序时,我正在阅读关于fork()的内容。我无法理解以下命令的输出,但如果删除第二个fork()调用,我可以了解它的作用。请给我解释一下以下程序的流程 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <error.h> #include <unistd.h> #include <sys/types.h> #include &l
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;
int main(int argc, char const *argv[])
{
pid_t pid;
int returnvalue;
pid = fork();
pid = fork();
if (!pid) cout<< "In the child"<<endl;
else cout<< "In parent"<<endl;
cout<< (&returnvalue)<<endl;
switch(pid)
{
case -1:
perror("fork");
return 0;
case 0:
cout<< "Child Process with pid: " <<getpid()<<endl;
cout<< "Parent's pid is: "<<getppid()<<endl;
cout<< "Exiting"<<endl;
returnvalue=2;
return returnvalue;
default:
cout<< "Parent process with pid: "<<getpid()<<endl;
cout<< "Child's pid: "<<pid<<endl;
cout<< "Waiting for child to exit"<<endl;
wait(&returnvalue);
cout<< "Child's exit status: "<<WEXITSTATUS(returnvalue)<<endl;
cout<< "Exiting!"<<endl;
}
return 0;
您有两个对fork()的调用将导致4个进程
1st fork in P1 --> new process P2
2nd fork in P1 --> new process P3
2nd fork in P2 --> new process P4
基于第二个fork()之后的结果,pid将有所不同。为了便于解释,我只想说P1是父对象,并且仍然是父对象,P2是P1的子对象,但却是P4的父对象,因此其pid将不为零,P3和P4的pid都将等于0。所有4个进程都将进入带有pid的switch语句,该pid将它们分类为父进程或子进程,因此,由于2个进程的pid=0,2个进程的pid!=0,2将报告为家长,2将报告为孩子
P1 pid != 0 (classify parent)
P2 pid != 0 (classify parent)
P3 pid == 0 (classify child)
P4 pid == 0 (classify child)
确实,P1是在P2之前创建的,P3是在P4之前创建的,但是当它们进入switch语句并打印出消息时,它们的消息由调度器控制。考虑创建一个过程需要很多时间(更多的只是打印东西)的可能性。所以P1创建P2,然后转身创建P3,同时P2正忙于创建P4。P3被创建并打印内容,而P2仍然无法创建P4。您确实有2个对fork()的调用将导致4个进程
1st fork in P1 --> new process P2
2nd fork in P1 --> new process P3
2nd fork in P2 --> new process P4
基于第二个fork()之后的结果,pid将有所不同。为了便于解释,我只想说P1是父对象,并且仍然是父对象,P2是P1的子对象,但却是P4的父对象,因此其pid将不为零,P3和P4的pid都将等于0。所有4个进程都将进入带有pid的switch语句,该pid将它们分类为父进程或子进程,因此,由于2个进程的pid=0,2个进程的pid!=0,2将报告为家长,2将报告为孩子
P1 pid != 0 (classify parent)
P2 pid != 0 (classify parent)
P3 pid == 0 (classify child)
P4 pid == 0 (classify child)
确实,P1是在P2之前创建的,P3是在P4之前创建的,但是当它们进入switch语句并打印出消息时,它们的消息由调度器控制。考虑创建一个过程需要很多时间(更多的只是打印东西)的可能性。所以P1创建P2,然后转身创建P3,同时P2正忙于创建P4。P3被创建并打印内容,而P2仍然无法创建P4。您确实有2个对fork()的调用将导致4个进程
1st fork in P1 --> new process P2
2nd fork in P1 --> new process P3
2nd fork in P2 --> new process P4
基于第二个fork()之后的结果,pid将有所不同。为了便于解释,我只想说P1是父对象,并且仍然是父对象,P2是P1的子对象,但却是P4的父对象,因此其pid将不为零,P3和P4的pid都将等于0。所有4个进程都将进入带有pid的switch语句,该pid将它们分类为父进程或子进程,因此,由于2个进程的pid=0,2个进程的pid!=0,2将报告为家长,2将报告为孩子
P1 pid != 0 (classify parent)
P2 pid != 0 (classify parent)
P3 pid == 0 (classify child)
P4 pid == 0 (classify child)
确实,P1是在P2之前创建的,P3是在P4之前创建的,但是当它们进入switch语句并打印出消息时,它们的消息由调度器控制。考虑创建一个过程需要很多时间(更多的只是打印东西)的可能性。所以P1创建P2,然后转身创建P3,同时P2正忙于创建P4。P3被创建并打印内容,而P2仍然无法创建P4。您确实有2个对fork()的调用将导致4个进程
1st fork in P1 --> new process P2
2nd fork in P1 --> new process P3
2nd fork in P2 --> new process P4
基于第二个fork()之后的结果,pid将有所不同。为了便于解释,我只想说P1是父对象,并且仍然是父对象,P2是P1的子对象,但却是P4的父对象,因此其pid将不为零,P3和P4的pid都将等于0。所有4个进程都将进入带有pid的switch语句,该pid将它们分类为父进程或子进程,因此,由于2个进程的pid=0,2个进程的pid!=0,2将报告为家长,2将报告为孩子
P1 pid != 0 (classify parent)
P2 pid != 0 (classify parent)
P3 pid == 0 (classify child)
P4 pid == 0 (classify child)
确实,P1是在P2之前创建的,P3是在P4之前创建的,但是当它们进入switch语句并打印出消息时,它们的消息由调度器控制。考虑创建一个过程需要很多时间(更多的只是打印东西)的可能性。所以P1创建P2,然后转身创建P3,同时P2正忙于创建P4。P3被创建并打印内容,而P2仍在创建P4。如果我没有错的话,P1(5487)创建P2(5488)和P3(5489)并依次生成P2(5490)?但是为什么P3在P2和P4之前被执行呢?如果我没有错的话,P1(5487)创建P2(5488)和P3(5489),P2依次派生P4(5490)?但是为什么P3在P2和P4之前被执行呢?如果我没有错的话,P1(5487)创建P2(5488)和P3(5489),P2依次派生P4(5490)?但是为什么P3在P2和P4之前被执行呢?如果我没有错的话,P1(5487)创建P2(5488)和P3(5489),P2依次派生P4(5490)?但是为什么P3在P2和P4之前被执行呢?