Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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
C语言中使用switch语句实现分叉过程的程序设计_C_Switch Statement_Fork - Fatal编程技术网

C语言中使用switch语句实现分叉过程的程序设计

C语言中使用switch语句实现分叉过程的程序设计,c,switch-statement,fork,C,Switch Statement,Fork,我试图从父进程分叉2个进程,如下所示,但有时会出现错误(程序未完成),我不知道原因: pid_t pidA, pidB; pidA = fork(); switch (pidA) { case -1: // error handling return -1; case 0: // first child code break; default: { // parent code 1

我试图从父进程分叉2个进程,如下所示,但有时会出现错误(程序未完成),我不知道原因:

pid_t pidA, pidB;
pidA = fork();
switch (pidA) {
    case -1: 
        // error handling
        return -1;
    case 0:
        // first child code
        break;
    default: {
        // parent code 1
        pidB = fork();
        switch(pidB) {
            case -1:
                // error handling
                return -1;
            case 0:
                // second child code
                break;
            default:
                // parent code 2, I think it's the same like parent code 1. Am I right?
                waitpid(-1, NULL, 0);
                printf("parent\n");
                break;
         }
         // parent code 3, again same like parent code 1 and 2 ???
         // when I use printf("Parent\n"); here it prints Parent 2 times and I don't know why.
     }
 }
有人能帮我找到这里的问题吗。 有什么解释就好了。
谢谢你

你到底想在这里做什么? 当您第一次使用fork时,您的第一个子进程实际上什么都不做。 父级将继续并再次返回
pidB
,然后继续执行,直到执行
waitpid()
函数为止

我假设您正在尝试等待新的子代码执行,然后在父代码继续打印“parent”之前终止

您正在等待-1的PID,它可能应该是
pidB

如果将
printf()
放在开关块外,则子项将在输出时打印“父项”,与生成它的父项相同。如果希望子级立即终止,可能需要return语句而不是break语句

按原样运行代码,在第二个
开关
语句之外使用
printf
语句,这是我的输出,使用
pidB
显示正在打印的进程:

parent
Parent: pid=25046
Parent: pid=0
结果表明,这个孩子也是印刷者之一

如果在内部开关盒0中添加一个返回而不是中断,则会得到以下结果:

parent
Parent: pid=25095
以下是我的建议

// parent code 1
    pidB = fork();
    switch(pidB) {
        case -1:
            // error handling
            return -1;
        case 0:
             // second child code
             break;
        default:
            // parent code 2, I think it's the same like parent code 1. Am I right?
            waitpid(pidB, NULL, 0); // wait for the child process to finish by using the PID of the child as the argument to waitpid
            printf("parent\n");
            break;
     }
     // the child will execute anything here unless you return or otherwise prevent the child process from getting here.

考虑流程树:

    P
   / \
  P   C1
 / \
P  C2
第一个分叉:拆分为p和C1

第二个fork:拆分为p和C2

C1
返回,不打印任何内容

C2
从开关断开,打印
父项(注意大写字母p)并返回

p打印
parent
parent

这就解释了为什么它会打印两次
Parent



对于未完成的程序,请检查的返回值并尝试进行相应的调试。

我正在尝试从父进程分叉两个进程。然后每个进程将运行自己的代码,这只是示例示例。我希望家长等待他的孩子,然后运行自己的代码。我已经更新了我的答案,以反映您应该如何处理孩子和家长。记住,当您使用fork()时,每个进程都会自己并行执行。如果有特定的代码段您不想执行,那么您需要确保它位于“父级”永远无法到达的区域,反之亦然。确保使用waitpid()的返回值来了解发生了什么;只等待第二个孩子,第一个孩子呢?我想等待父级创建的每个进程,然后运行父级代码。我把break改为return,但它并没有帮助50次程序完成正确的51次失败。也许如果我使用if语句会更好…放一个
waitpid(pidA,NULL,0)就在第二个叉子之前,或者任何你想让它等待的地方。你有两个孩子;你等待其中一个完成,而不是另一个。我不相信使用
开关
。我想它是可以工作的,但它看起来像意大利面,在某种程度上,使用
if/then/else
正确构建的代码不起作用……尽管我显然有偏见)。