我在编写的C程序中使用“/ usr / bin / sort”调用execl时遇到了麻烦。对sort的调用似乎不是从stdin读取或打印任何输出。代码如下:
// forking children, creating pipes, etc.
// ...
// These lines:
char msg[256];
read(pipe2[0], msg, 256*10);
printf("%s\n", msg);
//Produce this output:
bash-4.2/make_cmd.c:2
bash-4.2/mailcheck.h:0
bash-4.2/findcmd.c:6
bash-4.2/command.h:4
bash-4.2/config-top.h:1
bash-4.2/redir.c:2
bash-4.2/variables.c:7
bash-4.2/unwind_prot.c:0
bash-4.2/arrayfunc.h:0
bash-4.2/variables.h:0
bash-4.2/bracecomp.c:0
...
// So I know that pipe2[1] is being written to by the previous child.
// but for some reason this child will not read from pipe2[0]
pid_3 = fork();
if (pid_3 == 0) {
/* Third Child */
memset(cmdbuf, 0, BSIZE);
dup2(pipe2[0], STDIN_FILENO);
dup2(pipe3[1], STDOUT_FILENO);
close(pipe2[0]);
close(pipe3[1]);
sprintf(cmdbuf, "/usr/bin/sort -t : +1.0 -2.0 --numeric --reverse");
if(execl("/usr/bin/bash", "bash", "-c", cmdbuf, (char*)NULL) < 0){
perror("Error calling sort: ");
return(-1);
}
exit(0);
}
// and after "reading..." is printed, the program hangs instead of
// printing "parent: [whatever the output of sort would be]\n"
printf("reading...\n");
read(pipe3[0], msg, BSIZE);
printf("parent: %s\n", msg);
exit(0);
即使我将cmdbuf作为“-t:”传递,或者将调用传递给不带参数的sort,也没有任何反应。我也试过直接传递sort而没有/ usr / bin / bash就像这样
execl("/usr/bin/sort", "sort", (char*)NULL);
无济于事。
答案 0 :(得分:0)
如果您是在UNIX中使用管道的新手,那么问题就不那么明显了。
我的程序打开了3个总管道。每个孩子只使用这些管道中的两个来路由他们的stdin和stdout数据。对于每个孩子,我只关闭了那些被复制到该孩子的stdin和stdout文件描述符的管道。显然这是禁止的,正确的做法是让每个孩子在完成调用dup2时关闭每个管道。来源:http://www.tldp.org/LDP/lpg/node11.html