Linux读写管道

管道创建成功后分别会返回一个读和写管道描述符,可以用文件操作的相关函数对描述符进行读写。

 

  • 如果管道的写描述符关闭,则读函数返回读出的字节数是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;
}

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值