请考虑以下代码:
#include<stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#define READ 0
#define WRITE 1
int fd[2];
void execute(char*[], int mode);
int main()
{
char * command1[3] = {"cat", "output.txt", NULL};
char * command2[3] = {"wc", "-l", NULL};
pipe(fd); // creating pipe...
execute(command1, WRITE); // execute command1 and write output to pipe
execute(command2, READ); // execute command2 and get output from pipe
return 0;
}
//....................... DEFINATION .......................
void execute(char* command[], int mode)
{
pid_t pid;
pid = vfork();
if(pid == 0)
{
if(mode == WRITE) // writes successfully to the pipe...
{
close(1);
dup(fd[WRITE]);
close(fd[READ]);
close(fd[WRITE]);
execvp(command[0], command);
}
else if(mode == READ) // doesnot read from the pipe and goes to the wait state...
{
close(0);
dup(fd[READ]);
close(fd[WRITE]);
close(fd[READ]);
execvp(command[0], command);
}
}
else if(pid > 0)
{
wait(NULL);
}
}
我正在尝试编写一个程序,该程序使用带有stdout的管道从第一个进程被重定向为第二个进程的stdin。但我遇到了一个问题。上面的代码执行第一个命令&#34; command1&#34;并成功地将数据写入管道。但是第二个命令&#34; command2&#34;不会从管道中读取数据并进入某种等待/阻塞状态。我不知道问题是什么。如果成功完成对管道的写入,那么为什么从管道读取不成功?
帮助将受到高度关注。在此先感谢!!!
答案 0 :(得分:2)
因为父母没有关闭管道的WRITE部分,所以读者被阻止等待永远不会来的数据(父母正在等待他被阻止的孩子)。
只需在致电close(fd[WRITE]);
功能之间添加对execute
的通话。
总是关闭管道的未使用端......
您也可能不会以这种方式调用wait
(您的子进程逐个执行),在调用wait
后调用execute
(调用等待两次)。