我一直在寻找和阅读手册,但仍然无法获得管道机制。我正在制作一个程序,应该执行以下操作:
父进程创建管道,两个子进程并等待。
父关闭管道并杀死孩子。
所以我得到了这个C代码(我减少了它以便帖子符合规则):
const int PIPE_READEND=0;
const int PIPE_WRITEEND=1;
(...)
if (child1 == 0) {
//Child1 code here
close(fd[1]);
struct sigaction sa;
sa.sa_handler = sigHandler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGUSR1,&sa,NULL) == -1){ //Handling SIGUSR1 signal
perror("Signal handling unexpected error");
exit(errno);
}
int a,b;
srand(time(&t));
if (dup2(fd[PIPE_READEND],1) < 0){ //Redirecting stdout to the pipe fd.
perror("In Child1 Redirecting stdout to pipe error");
exit(errno);
}
close(fd[0]);
while(1){
a = rand();
b = rand();
printf("%d %d\n", a, b);
sleep(1);
}
(...)
if ((child2 = fork()) < 0){
perror("Fork error in Child2 process");
exit(errno);
} else if (child2 == 0){
//Child2 code here
close(fd[PIPE_READEND]);
FILE *outfile = fopen("out.txt","w");
dup2(fd[PIPE_WRITEEND],0);
dup2(outfile,1);
close(fd[PIPE_WRITEEND]);
execl("c1/main","main",(char *)NULL);
问题是,执行后,out.txt保持为空。我对管道数组索引感到失望,其中一个用于什么。
答案 0 :(得分:1)
FILE *outfile = fopen("out.txt","w");
dup2(fd[PIPE_WRITEEND],0);
dup2(outfile,1);
这没有任何意义。 dup2
函数不会将FILE *
作为参数。使用open
,而不是fopen
。
答案 1 :(得分:1)
您从错误的管道索引中读取和读取。你需要改变它们:
这会将stdout重定向到管道输入。
close(fd[0]);
dup2(fd[1], STDOUT_FILENO);
这会将管道输出重定向到stdin。
close(fd[1]);
dup2(fd[0], STDIN_FILENO);
同样dup2
取整数,而不是指针,所以你应该这样做:
f = fopen("out.txt", "w");
dup2(fileno(f), STDOUT_FILENO);