【发布时间】:2020-07-22 03:39:23
【问题描述】:
标题不言自明,这是我当前的代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main() {
pid_t pid ;
int fd[2], fd2[2];
pipe(fd);
pipe(fd2);
pid = fork();
if(pid == 0) {
close(1);
dup(fd[1]);
close(fd[0]);
close(fd[1]);
char *exp[] = {"cat", "filename.txt", NULL};
execvp("cat", exp);
exit(EXIT_FAILURE);
}
else if(pid > 0) {
close(1);
dup(fd2[1]);
close(fd2[0]);
close(fd2[1]);
char *exp[] = {"grep", "-w", "stringname", NULL};
execvp(exp[0], exp);
pid_t pid2=fork();
close(0);
dup(fd[0]);
close (fd[1]);
close(fd[0]);
char *exp2[] = {"grep", "-c", "stringname", NULL};
execvp(exp2[0], exp2);
exit(EXIT_FAILURE);
}
else {
printf("Error in forking");
exit(EXIT_FAILURE);
}
close(fd[0]);
close(fd[1]);
close(fd2[0]);
close(fd2[1]);
return 0;
}
目前程序正在编译但未执行(它在执行时卡在某个地方,我没有得到任何输出),任何关于我做错了什么的帮助以及如何解决它?
【问题讨论】:
-
您没有关闭足够的文件描述符。每个进程需要关闭所有四个管道文件描述符。
-
刚刚这样做了,结果还是一样,我想我应该在创建第二个进程后添加一个
if(pid2>0),现在就这样做 -
这样做了,结果也没有任何变化。
-
正在写入
fd2的grep在读取时被阻止。 -
@WilliamPursell 所以你的意思是我在父进程开始时删除了
close(fd2[0])?