浅谈Linux中的 管道

  • 管道:管道是⼀一种最基本的IPC机制,由pipe函数创建;
    调⽤用pipe函数时在内核中开辟⼀一块缓冲区(称为管道)⽤用于通信,它有⼀一个读端⼀一个写端,然后通过filedes参数传出给⽤用户程序两个⽂文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端。
#include <unistd.h>
int pipe(int filedes[2]);

模拟实现一个单向管道:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
    int fd[2] = {0,0};
    if(pipe(fd) < 0)
    {
        perror("pipe");
        return 1;
    }

    pid_t id = fork();
    if(id == 0)
    {
        char msg[] = "pipe666";
        while(1)
        {
            write(fd[1],msg,sizeof(msg));
            sleep(1);
        }
        close(fd[0]);
    }else{
        //father -> read
        char buff[1024] = {0};
        while(1)
        {            
            read(fd[0],buf,sizeof(buff));
            printf("%s\n",buff);
        }
        close(fd[1]);
    }    

    return 0;
}

每隔一秒从管道中读取一次

管道的五个特点:

  1. 智能进行单向通信;
  2. 智能用于有血缘关系的访问,常用于父子;
  3. 生命周期随进程;
  4. 通过流的方式进行访问;
  5. 以互斥为前提条件,拥有同步机制。

管道会产生的四种情况:
1.读端不读不关闭相应文件描述符表,写端写满会等待;
2.写端不写不关闭相应文件描述符表,读端会等待;
3.读端不读且关闭相应文件描述符表,写端会被操作系统终止;
4.写端不写且关闭相应文件描述符表,读端读完会关闭;

匿名管道与命名管道区别

匿名管道由pipe函数创建并打开。
命名管道由mkfifo函数创建,打开用open
FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一量这些工作完成之后,它们具有相同的语义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值