Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 如何使fork与父进程交互';菜单不打印菜单两次?_C_Unix - Fatal编程技术网

C 如何使fork与父进程交互';菜单不打印菜单两次?

C 如何使fork与父进程交互';菜单不打印菜单两次?,c,unix,C,Unix,我正在做作业,需要一些帮助,了解如何在使用fork()函数时避免打印重复项 我的代码流程假定如下:打印菜单,用户选择一些选项,然后使用fork()创建一个重复的过程来执行选项所说的操作。 我在以下代码中隐藏了它的功能,并进行了打印,以便更容易理解: int main() { int option; pid_t pid; while (option != 3) { printf("\nMenu:"): printf("\n1 browser"):

我正在做作业,需要一些帮助,了解如何在使用
fork()
函数时避免打印重复项

我的代码流程假定如下:打印菜单,用户选择一些选项,然后使用
fork()
创建一个重复的过程来执行选项所说的操作。 我在以下代码中隐藏了它的功能,并进行了打印,以便更容易理解:

int main() {
    int option;
    pid_t pid;
    while (option != 3) {
       printf("\nMenu:"):
       printf("\n1 browser"):
       printf("\n2 terminal"):
       printf("\n3 finish"):
       printf("\nOption:"):
       scanf("%d", &option);
       switch (option) {
           case 1:
               if ((pid = fork()) == -1) {
                    printf("error");
               } else {
                    printf("browser");
               }
               break;
           case 2:
               if ((pid = fork()) == -1) {
                    printf("error");
               } else {
                    printf("terminal");
               }
               break;
           case 3:
               break;
           default:
               break;
    }
    return 0;
}

问题是这段代码会打印菜单,然后当我选择一些选项时,它不仅会执行我想要的操作,而且最终还会打印两次菜单,而且应该只打印一次,因为它会在执行预期操作后返回菜单。有没有办法避免这种情况?

不清楚
fork()
是否对您有用,除非您忽略了一些重要的逻辑

但是,如果您确实想使用它,您需要:

  • 通过检查
    pid
    的值,在父进程和子进程中表现不同。(在子进程中它将为零。)

  • 完成后,让该子进程退出(),而不是落入主循环

  • 让父进程使用
    wait()
    waitpid()
    等待子进程退出,然后再继续主循环


  • 现在还不清楚
    fork()
    是否对您有用,除非您忽略了一些重要的逻辑

    但是,如果您确实想使用它,您需要:

  • 通过检查
    pid
    的值,在父进程和子进程中表现不同。(在子进程中它将为零。)

  • 完成后,让该子进程退出(),而不是落入主循环

  • 让父进程使用
    wait()
    waitpid()
    等待子进程退出,然后再继续主循环


  • 就像你所说的,我使用了一些重要的逻辑,但是问题可以用这部分代码来解释。但是我会按照你说的去做,谢谢。就像你说的,我会使用一些重要的逻辑,但是问题可以通过代码的这一部分来解释。但我会照你说的做,谢谢。