C中多个fork中的execl同步运行/阻塞

C中多个fork中的execl同步运行/阻塞,c,exec,fork,C,Exec,Fork,我有两个简单的程序,我用来修改文本文件 第一个接收命令文件和要修改的文件列表。第二个程序由第一个程序运行,接收一个要读取的文件作为参数,然后从stdin读取命令,在文件上执行命令,完成后显示给stdout。重复一遍 我的问题是,每个fork似乎都在等待其他fork完成它的所有命令,而不是启动自己的命令 主程序 我得到的示例输出 forks阻塞并完成其所有任务,而不是并行运行。有什么我做错了吗?这些fork开始并发运行,但它们都在调用scanf时等待通过管道输入。尝试更改写入的顺序,读取的顺序也会

我有两个简单的程序,我用来修改文本文件

第一个接收命令文件和要修改的文件列表。第二个程序由第一个程序运行,接收一个要读取的文件作为参数,然后从stdin读取命令,在文件上执行命令,完成后显示给stdout。重复一遍

我的问题是,每个fork似乎都在等待其他fork完成它的所有命令,而不是启动自己的命令

主程序

我得到的示例输出


forks阻塞并完成其所有任务,而不是并行运行。有什么我做错了吗?

这些fork开始并发运行,但它们都在调用scanf时等待通过管道输入。尝试更改写入的顺序,读取的顺序也会更改。此外,每当strlencmds超过PIPE_BUF时,您可能会观察到不同的结果


在管道上写入比PIPE_BUF短的内容保证在另一端以一个块的形式交付。并不是说CMD中的每个命令都会唤醒子进程。

我认为,通过执行WritePies[f][1]、CMD、strlencmds并将所有命令一次性写入各自的管道,每个fork在准备好读取stdin时都可以自由读取。每当子进程调用scanf时,它们都会被放入等待队列,等待输入。当父级写入管道时,相应的子级几乎同步唤醒。对于更精细的粒度,您可以考虑拆分CMD中的命令并将它们分别发送到单独的写入中。我尝试分离它们,但它没有改变任何东西。仍然阻塞。我知道scanf会让进程等待,但一旦他们收到第一个命令,他们不应该重叠吗?我应该得到这样的结果:文件2上的命令A,文件1上的命令A,文件3上的命令A,文件2上的命令B。。。
int main(int argc, char const *argv[]){

    ...

    // Multiple forks
    for(i=2; i < argc; i++){

        ...

        pipe(pipes[forks]);
        forks++;

        pid = fork();
        if(pid == 0) break;

        ...
    }

    if(pid == 0){
        dup2(pipes[forks-1][0], STDIN_FILENO);

        // Execute the second program in the fork, 
        // pass a file to be read as a single argument
        execl("second_program", "second_program" , argv[i], NULL);
        fprintf(stderr, "execl() failed\n");
        return EXIT_FAILURE;

    } else {

        ...

        // Reads a file containing commands, normalize it and output a string
        char *cmds = getcmds(argv[1]);
        int f;
        for(f=0; f < forks; f++){
            // Send the list of commands to the second program
            write(pipes[f][1], cmds, strlen(cmds));
        }

        wait(NULL);
    }

    return 0; 
}
int main(int argc, char const *argv[]){

    ...

    char buffer[READ_SIZE];
    do {

        scanf("%s",buffer);
        if(strcmp(buffer,"COMMAND_A") == 0){

            ...
            printf("`COMMAND_A on %s\n", filename);

        } if(strcmp(buffer,"COMMAND_b") == 0){

            ...
            printf("`COMMAND_b on %s\n", filename);

        } else {
            break;
        }

        ...                             

    } while(1);

    return 0;
}
COMMAND_A on file1
COMMAND_B on file1
...
COMMAND_Z on file1
COMMAND_A on file2
COMMAND_B on file2
...
COMMAND_Z on file2
COMMAND_A on file3
COMMAND_B on file3
...
COMMAND_Z on file3