Fork()在开关盒中打印多个盒子

时间:2015-01-08 09:56:59

标签: c++ linux linux-kernel switch-statement fork

我刚刚开始学习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 孩子来了

  • 问题1:我不明白为什么案例0:和默认:获取 执行!
  • 问题2:根据我的意思,如果子进程是,则a的值应为0 创建成功了!

3 个答案:

答案 0 :(得分:3)

  

问题1:我不明白为什么案例0:和默认:都被执行了!

案例0由子进程执行,其中fork返回0.默认情况在父进程中执行,其中fork的返回值是新子进程的pid

正如documentation所说,

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.

因此,在您的示例中,您将 288660作为两个单独进程(父进程和子进程)中的返回值来解释输出。请注意,输出顺序可能会有所不同。

这是fork已完成:您想要同时执行您的程序或程序的一部分。返回值允许您检测您所处的进程。