进程间通信—无名管道

gg = shiftg快速对齐

加锁顺序问题时,如果解锁了,两个同时申请抢锁,谁抢到了运行谁,循环迭代时释放锁也是同时申请锁,循环部分如果没抢到锁就进入循环等待

总结:
IPC   进程间通信  interprocess communicate
//signal 

三大类:

  1.同主机   ---- 基于内存的 
  古老的通信方式 
    //管道  ---- 
      无名管道  
      有名管道
    //信号  
      
  IPC对象通信(改进)
     消息队列(用的相对少,这里不讨论)
     共享内存(*) //最高效 
     信号量集() //信号量  
      
2.不同主机 
  socket //网络部分 

//同一主机
1、古老的通信方式
        管道:
           无名管道  
           有名管道  
        信号

2、IPC对象通信 system v    BSD     suse fedora   kernel.org
        消息队列(用的相对少,这里不讨论)
        共享内存(*) //最高效 
        信号量集() //信号量  


//不同主机 
3、socket通信
        网络通信
        
        
        
【原理】:        
+-进程A-+              +-进程B-+   <--        
|       |              |       |     ^
|       |              |       |     |
|       |              |       |    0~3G
|       |              |       |     
|       |              |       |     |
|       |              |       |     |
|       |                |       |     V
+------------------------------+     --
|         内核                 |     1G
+------------------------------+   <----


//举例:
线程信号:
      posix  sem_init
特列:
      古老的通信方式中,信号是唯一的异步通信
      所有的通信方式中,共享内存是最高效的

管道==》无名管道、有名管道

    无名管道 ===》pipe ==》只能给有亲缘关系进程通信
    有名管道 ===》fifo ==》可以给任意单机进程通信(同一主机内)


    管道的特性:
    1、管道是 半双工的工作模式
    2、所有的管道都是特殊的文件不支持定位操作。
       lseek->> fd  fseek ->>FILE* 
       数据流 --- FIFO(first in first out)
    3、管道是特殊文件,读写使用文件IO。
       fgets,fread,fgetc,
       open,read,write,close;;
    
    
    单  工    广播 
    半双工       对讲机 
    全双工    电话 
    
    -----
    
    
    亲缘关系 
    
    
    读端存在,做写 
    管道空,随便写 
    管道满,写阻塞 
    
    读端不存在,做写 
    管道破裂,SIGPIPE 
    
    
    写端存在,做读
    管道中有数据,则读取数据,最终把数据读完
    管道中没有数据,则读操作阻塞 
    
    写端不存在,做读
    管道中有数据,则读取数据,最终把数据读完
    管道中没有数据,则读操作不阻塞,立即返回 
    
    
    
    1.读端存在,一直向管道中去写,超过64k,写会阻塞。
    2.写端是存在的,读管道,如果管道为空的话,读会阻塞。
    3.管道破裂,,读端关闭,写管道。
    
    
    
    管道的读写规则:
    1.读端存在,写管道
      管道空:可以写数据
      管道满:会造成-->写阻塞 
      
    2.读端不存在,写管道
      系统会给进程发一个信号SIGPIPE(管道破裂)

    3.写端存在,读管道
      管道空,读不到数据,
      这时会造成读操作阻塞

    4.写端不存在,读管道 
      如果管道中有数据,则读取这些数据!
      如果没有数据,读操作不阻塞,立即返回!
      
      ---------------
      "hello pipe!"
      ---------------
     

//
使用框架:
    创建管道 ==》读写管道 ==》关闭管道

1、无名管道 ===》管道的特例 ===>pipe函数
    特性:
    1.1  亲缘关系进程使用
    1.2  有固定的读写端

    流程:
    创建并打开管道: pipe函数
    #include <unistd.h>
    int pipe(int pipefd[2]);
    int pipe(int *pipefd);
    int fd[2];
    功能:创建并打开一个无名管道
    参数:pipefd[0] ==>无名管道的固定读端//0 -- 标准输入
          pipefd[1] ==>无名管道的固定写端//1 -- 标准输出 
    返回值:成功 0
            失败 -1;

注意事项:
    1、无名管道的架设应该在fork之前进行。
    
无名管道的读写:===》文件IO的读写方式。
    读: read()  //能否标准IO的操作? 
    写: write()

关闭管道: close();

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值