赞
踩
管道创建成功后分别会返回一个读和写管道描述符,可以用文件操作的相关函数对描述符进行读写。
- #include<stdio.h>
- #include<unistd.h>
- #include<stdlib.h>
- #include<wait.h>
- #include<errno.h>
- #include<signal.h>
- #include <setjmp.h>
-
- #include<sys/types.h>
- #include<fcntl.h>
- #include<sys/stat.h>
- /*首先创建了管道,然后创建子进程,在子进程里面用execlp函数执行ls命令,利用函数dup2将
- 子进程的标准输出重定向到管道描述符,使得本来应该输出到屏幕的ls命令结果
- 输出到了管道的写描述符,而在父进程里面调用execlp函数执行wc命令,同样调用dup2将父
- 进程的标准输入重定向由标准输入变成了管道的读描述符,这样父进程执行wc命令时
- 其输入就是从管道读取的数据,恰好是由子进程执行ls命令输出的数据,巧妙实现了利用管道编程实现了shell功能ls-l|wc-l这个功能*/
- <span style="font-family: Arial, Helvetica, sans-serif;">
- int main()
- </span><span style="font-family: Arial, Helvetica, sans-serif;">{
- int pfds[2];//创建数组保存管道返回的文件描述符号</span>
- if (pipe(pfds) == 0)
- {
- if (fork() == 0)//子进程
- {
- close(1);//等价与STDOUT_FILENO
- dup2(pfds[1], 1);//将管道的写文件描述符号复制到进程的标准输出
- close(pfds[0]);//关闭管道的读
- execlp("ls", "ls","-l", NULL);//执行ls -l命令,将输出写入管道
- }
- else//父进程
- {
- close(0);//关闭标准输入
- dup2(pfds[0], 0);//将管道的读文件描述服复制到进程的标准输入
- close(pfds[1]);//关闭管道的写
- execlp("wc", "wc", "-l", NULL);//执行wc -l,将从管道读去的数据作为输出
- }
- }
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。