如何解决基本管道不在 c 中终止
我尝试运行以下简单代码:
int main(int argc,char* argv[]) {
int fds[2];
pipe(fds);
int pid1,pid2;
if ((pid1 = fork()) == 0){
close(fds[0]); // close read end
dup2(fds[1],1); // connect write end
char *argv1[2] = {"echo","hi"};
execvp(argv1[0],argv1);
}
if ((pid2 = fork()) == 0){
close(fds[1]); // close write end
dup2(fds[0],0); // connect read end
char *argv2[2] = {"wc","-c"};
execvp(argv2[0],argv2);
}
int status;
waitpid(pid1,&status,0);
printf("pid=%d terminated with status=%d\n",pid1,status);
waitpid(pid2,pid2,status);
return 0;
}
我原以为 echo
和 wc
都会终止,但 wc
从未终止。
我从上面的代码中得到的输出类似于下面的内容(主进程暂停等待 wc
完成)。
pid=2802 terminated with status=0
知道为什么第二个分叉进程没有完成吗?
我已经检查过,在主进程短暂的 fds[0]
后尝试从 sleep
读取,wc
命令确实从回声。
解决方法
您需要关闭管道的所有写入端。该文件描述符有 4 个副本,并且 wc
不会在所有副本都关闭之前终止。 echo
将在终止时关闭它的两个副本,但最佳做法是在执行之前明确关闭未使用的副本:
dup2(fds[1],STDOUT_FILENO);
close(fds[1]);
在调用 waitpid
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。