fork()-让父进程执行工作而无需等待子进程

时间:2018-09-29 12:55:05

标签: c linux fork execv

我正在用C语言制作一个学校项目的外壳,如果命令执行该外壳,它可以并行运行进程。

这是等待命令的shell应用程序循环:

while (1) {
    action = parseShellArgs();

    if (action == 1) {
        printf("Exiting...\n");
        break;
    } else if (action == 0) {
        int pid = fork();

        if (pid < 0) {
            printf("Failed to fork\n");
        } else if (pid == 0) {
            (*NUM_PROCESSES_RUNNING)++;
            printf("There are %d processes running\n", *NUM_PROCESSES_RUNNING);
            char * solverArgs[] = {"a", shellArgs[1], NULL};    // first element is placeholder for argv[0]
            execv("CircuitRouter-SeqSolver", solverArgs);
            exit(0);
        } else if (pid > 0) {
            if (*NUM_PROCESSES_RUNNING >= MAXCHILDREN) {
                printf("All processes are busy\n");
                continue;
            }
            int status, childpid;

            wait(&status);
            childpid = WEXITSTATUS(status);
            (*NUM_PROCESSES_RUNNING)--;
            printf("There are %d processes running\n", *NUM_PROCESSES_RUNNING);
            (void)childpid;     // suppress "unused variable" warning
        } else {
            printf("Wait what\n");
        }
    } else {
        printf("Oops, bad input\n");
    }
}

请不要理会要递增和递减的常量。

现在,这仅部分起作用。每当我给它一个命令来创建另一个进程并运行另一个程序(条件操作== 0,这已经过测试并且可以工作)时,就会发生派生,并且程序正确执行。

但是,我不能多次分叉。我的意思是:程序派生,并且子程序按照execv调用中的指示执行。问题在于,它会等待子进程完成,而不是父进程返回到期望输入再次分叉的状态。

我想让这个周期做的是让父母总是期望输入和派生命令,如果需要,可以有多个孩子。但是正如我在上面解释的那样,父母被“卡住”,等待独生子女完成,然后才恢复活动。

谢谢。

编辑:我已经尝试了不等待子进程,使用额外的fork来期待输入等的多种组合。

1 个答案:

答案 0 :(得分:2)

来自man wait.2

  

wait()系统调用将暂停执行调用过程,直到          它的一个孩子终止。

您的程序被卡住了,因为wait就是这样做的。使用waitpid代替WNOHANG

waitpid(pid_child, &status, WNOHANG);

不会暂停调用过程的执行。您可以阅读waitpid man page来查找返回值以及如何知道孩子是否终止。