PIPE 使用介绍


一、pipe 简介

pipe 也叫无名管道,有如下特点:

  • 半双工,同一时刻数据只能一端操作
  • 数据只能从一端写入,从另一端读出
  • 存储在内存缓冲区,不存储在文件系统中,只能用于父子进程通信
  • 数据一旦从管道中读走,就从管道中释放空间

二、pipe 代码示例

创建无名管道,其中 fd[0] 固定用于读管道,而 fd[1] 固定用于写管道
一般文件 I/O 的函数都可以用来操作管道( lseek() 除外)
默认情况当管道里没有数据时,另一个进程调用 read() 函数从管道中读数据是阻塞的
默认情况当管道里数据满时,另一个进程调用 write() 函数向管道里写数据也是阻塞的
通信过程中,当别的进程结束后,当前进程读端口也关闭后,则再向管道内写数据时进程会收到SIGPIPE 信号,默认动作为中断当前进程,不过编程时可通过 fcntl() 函数设置文件的阻塞特性

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int fd_pipe[2] = {0};
    pid_t pid;

    pipe(fd_pipe);
    pid = fork();
    if (0 == pid)
    {
        sleep(2);
        char buf[] = "hello world";
        write(fd_pipe[1], buf, strlen(buf));
        _exit(0);
    }
    else
    {
        fcntl(fd_pipe[0], F_SETFL, O_NONBLOCK); // 非阻塞
        // fcntl(fd_pipe[0], F_SETFL, 0); // 阻塞
        for (int i=0; i<5; i++)
        {
            char str[128] = {0};
            read(fd_pipe[0], str, sizeof(str) ); //读数据
            printf("str=[%s]\n", str);
            sleep(1);
        }
        wait(NULL);
    }
    return 0;
}

在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值