Unix:获取execl函数以从stdin读取

时间:2014-02-25 08:06:04

标签: c unix stdin pipe

我在编写的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); 

无济于事。

1 个答案:

答案 0 :(得分:0)

如果您是在UNIX中使用管道的新手,那么问题就不那么明显了。

我的程序打开了3个总管道。每个孩子只使用这些管道中的两个来路由他们的stdin和stdout数据。对于每个孩子,我只关闭了那些被复制到该孩子的stdin和stdout文件描述符的管道。显然这是禁止的,正确的做法是让每个孩子在完成调用dup2时关闭每个管道。来源:http://www.tldp.org/LDP/lpg/node11.html