- 论坛徽章:
- 0
|
如何让程序接收stdout管道的内容?
自己改一下,看看是父进程关闭stdin还是什么的.
下面的程序是打开一个输入文件读入后,通过管道写入sort程序的标准输入流,进行排序.
相当于shell代码 cat <filename>; | sort,也就是匿名管道的应用方法.
自己试着改一下吧.
- //将父进程读入的文件通过管道写入到子进程的标准输入。
- // 创建了一个管道,并在子进程中调用execl执行了系统的排序程序sort
- //
- #include <stdio.h>;
- #include <unistd.h>;
- int main(int argc, char* argv[])
- {
- FILE* names; //输入文件
- FILE* sort; //连接到sort的输出文件
- int fd[2]; //管道的文件描述符
- int ch;
- if (argc != 2)
- {
- printf("使用方法: pipesort <输入文件名>;\n");
- exit(1);
- }
- names = fopen(argv[1], "r");
- if (NULL == names)
- {
- perror("fopen");
- exit(1);
- }
- if (fork() == 0)
- {
- //子进程代码
- close(0); //关闭标准输入文件描述符
- dup(fd[0]); //复制管道的输入端到标准输入
- close(fd[0]); //关闭多余的管道描述符
- close(fd[1]); //此处不使用管道的写入端口
- execlp("sort", "sort", NULL);
- perror("execlp");
- exit(0);
- }
- //父进程的代码.
- close(fd[0]); //不使用管道的读入端口.
- if (sort = fdopen(fd[1], "w") == NULL)
- {
- //无法打开管道写入端
- perror("fdopen");
- exit(1);
- }
- //复制数据到sort程序
- while ((ch = getc(names)) != EOF)
- {
- putc(ch, sort);
- }
- fclose(names);
- fclose(sort);
- return (0);
- }
复制代码 |
|