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