请考虑以下代码:
#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);
}
}
我正在尝试编写一个程序,该程序使用带有来自第一个进程的标准输出的管道被重定向为第二个进程的标准输入。但我面临一个问题。上面的代码执行了第一个命令“command1”并成功将数据写入管道。但是第二个命令“command2”不从管道读取数据并进入某种等待/阻塞状态。我不知道是什么问题。如果写入管道成功,那么为什么从管道读取不成功?
非常感谢您的帮助。提前致谢!!!
因为父级没有关闭管道的 WRITE 部分,所以读取器被阻塞等待永远不会到来的数据(父级正在等待他被阻塞的子级)。
只需在 execute
函数调用之间添加对 close(fd[WRITE]);
的调用即可。
注意始终关闭未使用的管道末端...
您也可以不这样调用wait
(您的子进程一个接一个地执行),在调用execute
之后将调用移至wait
>(调用 wait 两次)。
我是一名优秀的程序员,十分优秀!