Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在程序中使用fork时的执行_Linux_Fork - Fatal编程技术网

Linux 在程序中使用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

当我尝试以下程序时,我正在阅读关于fork()的内容。我无法理解以下命令的输出,但如果删除第二个fork()调用,我可以了解它的作用。请给我解释一下以下程序的流程

#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之前被执行呢?