cpipe道,标准input/标准输出和sorting

我试图写一个程序,分叉和发送sorting(Linux)的一些字sorting在标准input,因为sorting没有参数将使用标准input。 然后从父级的sort中收集stdout,输出到父级的stdout。

目前我的程序挂起。 任何人都可以帮我解释一下怎么了?

我的代码:

#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/stat.h> #include <string.h> #include <errno.h> #include <unistd.h> int main(int argc, char *argv[]){ int fi[2]; int fo[2]; int oldstdin; int oldstdout; if (pipe(fi) == -1){ exit(EXIT_FAILURE); } if (pipe(fo) == -1){ exit(EXIT_FAILURE); } oldstdin = dup(STDIN_FILENO); /* Save current sdtin */ oldstdout = dup(STDOUT_FILENO); /* Save current stdout */ close(STDIN_FILENO); close(STDOUT_FILENO); if(dup2 (fo[0],STDIN_FILENO) == -1) /* Make the read end of out to be stdin */ exit(EXIT_FAILURE); if(dup2 (fi[1],STDOUT_FILENO) == -1) /* Make the write end of in to be stdout */ exit(EXIT_FAILURE); switch(fork()){ case -1: exit(EXIT_FAILURE); case 0: /* CHILD */ close(fo[0]); close(fo[1]); close(fi[0]); close(fi[1]); execlp("sort","sort", (char *)NULL); default: break; /* fall through to parent */ } char input[100]; close(STDIN_FILENO); close(STDOUT_FILENO); dup2(oldstdin,STDIN_FILENO); dup2(oldstdout,STDOUT_FILENO); close(fo[0]); /* these are used by CHILD */ close(fi[1]); /* "" */ write(fo[1],"dino\nbat\nfish\nzilla\nlizard\0",27); input[read(fi[0], input,100)] = 0; printf("%s", input); } 

我不认为stdin会被终止:如果从一个文件重定向,这不会是stdin

但它需要知道什么时候输入完成(并且不会发射任何东西,直到它,所以你的阅读将被阻止)。 写入后尝试关闭fo[1]

哦,你可以在strace -f下运行这个来看看发生了什么,它会告诉你父母和子进程正在做什么。