PIPE 使用介绍

本文介绍了无名管道pipe的基本概念和特点,它是一种半双工的通信方式,用于父子进程间的通信。文中给出了一个使用pipe进行数据传输的C语言代码示例,展示了如何创建管道、读写数据,并通过fcntl()函数设置读取端为非阻塞模式。在通信过程中,当读写条件不满足时,进程会被阻塞,或者在特定情况下接收到SIGPIPE信号。
摘要由CSDN通过智能技术生成


一、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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值