Linux 中管道

什么是管道

管道是Linux中很重要的一种通信方式

管道的五种特点
  1. 单向通信

  2. 管道只能进行有血缘关系的进程之间通信

  3. 生命周期随进程(常驻进程最怕内存泄露)

  4. 对写方式基于流(面向字节流)(与传送数据的格式无关)

  5. 管道带有同步机制

    • 当两个进程同时访问一个资源时,该资源叫“临界资源”;
    • 当两个进程同时访问一个资源时的代码,叫临界区;
    • 解决二义性,进程访问临界资源使用互斥访问 必须保持原子性;
    • 进程要申请资源,但因(优先级等问题)无法申请到资源,处于饥饿状态;
    • 访问临界资源时以某种特定顺序访问叫“同步”(大多以互斥为条件);
管道四种情况:

1.读端不读不关闭相应文件描述符表,写端写满会等待;

2.写端不写不关闭相应文件描述符表,读端会等待;

3.读端不读且关闭相应文件描述符表,写端会被操作系统终止(发送SIGPIPE);

4.写端不写且关闭相应文件描述符表,读端读完会关闭;

管道通信示例 父子进程间通信

子进程一直写,父进程一直读

#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)
    {
        //child -> write
        char msg[] = "hello I am child msg";
        while(1)
        {
            write(fd[1],msg,sizeof(msg));
            sleep(1);
        }
        close(fd[0]);
    }else{
        //father -> read
        char buf[1024] = {0};
        while(1)
        {            
            read(fd[0],buf,sizeof(buf));
            printf("%s\n",buf);
        }
        close(fd[1]);
    }    

    return 0;
}

运行结果
命名管道与匿名管道

创建 匿名管道 实际上是创建一个64K大小的内存缓冲区,匿名管道的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。
如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为 命名管道 。命名管道是一种特殊类型的文件。

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

pipe&FIFO

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值