管道创建成功后分别会返回一个读和写管道描述符,可以用文件操作的相关函数对描述符进行读写。
- 如果管道的写描述符关闭,则读函数返回读出的字节数是0
- 如果管道的读描述符关闭,写返回错误SIGPIPE
- 如果管道写入时,管道已经满,写操作被阻塞直到空间存在
#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;
}