我刚刚开始学习Linux编程,我的怀疑对你来说似乎很愚蠢,但我真的很困惑,所以帮助我解决这个问题 - 这里是代码
#include <string>
#include <iostream>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include "err.h"
using namespace std;
int main(){
int a=-5;
switch(a=fork()){
case -1:
cout<<"error\n";
break;
case 0:
cout<<"here comes the child\n";
break;
default:
cout<<"a is "<<a<<endl;
// break;
}
return 0;
}
输出: a是28866 孩子来了
答案 0 :(得分:3)
问题1:我不明白为什么案例0:和默认:都被执行了!
案例0由子进程执行,其中fork
返回0.默认情况在父进程中执行,其中fork
的返回值是新子进程的pid
Fork创建了调用进程的精确副本,包括当前指令指针。即父进程和子进程都将执行switch语句。
问题2:根据我的说法,如果成功创建子进程,则a的值应为0!
在子进程中,是的。在父母中,它是子进程的pid。
答案 1 :(得分:2)
成功执行后,fork命令将子进程的进程id返回给父进程,并将0返回给子进程。 fork命令执行后,父进程和子进程都执行相同的指令集。在这种情况下,子进程和父进程都执行switch语句。值&#34; a是28866&#34;由儿童过程打印出来的价值&#34;这里来自孩子&#34;由父进程打印。要使父进程和子进程执行不同的指令,请检查fork命令的返回值。
答案 2 :(得分:1)
请参阅fork(2)文档:
On success, the PID of the child process is returned in the parent, and 0 is returned in the child.
因此,在您的示例中,您将 28866
和0
作为两个单独进程(父进程和子进程)中的返回值来解释输出。请注意,输出顺序可能会有所不同。
这是fork
已完成:您想要同时执行您的程序或程序的一部分。返回值允许您检测您所处的进程。