fork() - 让 parent 进程工作而不等待 child 进程

fork() - have parent process do work without waiting for child process

我正在用 C 语言为一个学校项目制作一个 shell,如果命令这样做,它能够 运行 并行处理。

这是等待命令的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,这已经过测试并且可以工作)时,就会发生分叉并且程序被正确执行。

但是,我不能多次分叉。我的意思是:程序分叉并且 child 按照 execv 调用中的指示执行。问题是 parent 进程没有返回到期望输入可能再次分叉,而是等待 child 进程完成。

我试图让这个循环做的是让 parent 始终期待输入并按照命令分叉,必要时有多个 children。但正如我上面解释的那样,parent 得到 "stuck" 等待单个 child 完成,然后才恢复 activity.

提前致谢。

编辑:我试验了多种组合,包括不等待 child 进程、使用额外的 fork 来期待输入等。

来自man wait.2

The wait() system call suspends execution of the calling process until one of its children terminates.

您的程序卡住了,因为那是 wait 所做的。使用 waitpid 代替 WNOHANG.

waitpid(pid_child, &status, WNOHANG);

不暂停调用进程的执行。您可以阅读 waitpid man page 以找出 return 值以及如何知道 child 是否终止。