fork() 在开关盒中打印多个大小写

Fork() printing multiple case in switch-case

本文关键字:打印 大小写 开关 fork      更新时间:2023-10-16

我刚开始学习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<<"errorn";
            break;
        case 0:
            cout<<"here comes the childn";
            break;
        default:            
            cout<<"a is "<<a<<endl;
//      break;
    }
    return 0;
}

输出:A 是 28866孩子来了

  • 问题1:I不明白为什么两种情况 0: 和默认值: 得到执行!
  • 问题2:根据我的说法,如果子进程是创建成功!

问题1:I不明白为什么情况 0: 和默认:都会被执行!

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

正如文档所述,Fork 创建了调用进程的精确副本,包括当前的指令指针。 即父进程和子进程都将执行 switch 语句。

问题2:根据我的说法,如果成功创建子进程,则a的值应为0!

在子进程中,是的。在父进程中,它是子进程的 pid。

成功执行后,fork 命令将子进程的进程 ID 返回给父进程,并将 0 返回给子进程。fork 命令执行后,父进程和子进程都执行同一组指令。在这种情况下,子进程和父进程都执行 switch 语句。值"a is 28866"由子进程打印,值"这里是子进程"由父进程打印。要使父进程和子进程执行不同的指令,请检查 fork 命令的返回值。

参见 fork(2) 文档:

   On success, the PID of the child process is returned in the parent,
   and 0 is returned in the child.

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

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