进程间的通信

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

2、IPC对象通信 system v    
        共享内存*
        消息队列        
        信号量集 
        
跨主机间的通信:
3、socket通信
        网络通信

管道-->无名管道、有名管道

    无名管道 -->pipe -->只能给有亲缘关系进程通信
    有名管道 -->fifo -->可以给任意两个进程通信
管道的特性:

    1、管道是 半双工的工作模式
    2、所有的管道都是特殊的文件不支持定位操作。
       lseek->> fd  fseek ->>FILE* 
    3、管道是特殊文件,读写使用文件IO。
    open,read,write,close;;

使用框架:
    创建管道 --> 读写管道 --> 关闭管道


1.无名管道:

特性:
    1.1  亲缘关系进程使用
    1.2  有固定的读写端

    流程:


    1.创建并打开管道: pipe函数


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

     
    2.无名管道的读写:文件IO的读写方式。


    
            读: read()
            写: write()

   3. 关闭管道: close();

   注意:无名管道的架设应该在fork之前进行。


    1.写阻塞:
    管道中至少有一个读端:
        写:
            管道中缓存区没有存满则直接写入
            管道中缓存区写满则阻塞等待直到有数据读出才能继续写入
    
    2.读阻塞:        
    管道中至少有一个写端:
        读:
            有数据时直接读出
            没有数据时阻塞等待直到有数据写入才能读出
            
    3.管道破裂:    
    管道中没有读端,写入数据:
        写:
            会产生管道破裂信号SIGPIPE,进程异常结束

    4.读到0返回:        
    管道中没有写端:
        读:
            有数据时直接读出 
            没有数据时不会阻塞等待直接返回,读到0

 


2.有名管道

有名管道-->fifo -->有文件名称的管道。
                                 文件系统中可见,可用于任意进程间的通信。


框架:
    创建有名管道 -->打开有名管道 -->读写管道
    -->关闭管道  -->卸载有名管道

1、创建:mkfifo


#include <sys/types.h>
#include <sys/stat.h>


int mkfifo(const char *pathname, mode_t mode);
功能:在指定的pathname路径+名称下创建一个权限为
      mode的有名管道文件。
参数:pathname要创建的有名管道路径+名称
      mode  8进制文件权限。
返回值:成功 0
        失败  -1;

2、打开有名管道 open

    以O_RDONLY打开时 ,管道在open处阻塞
    以O_WRONLY打开时 ,管道在open处阻塞

    当两端同时打开时,才解除阻塞。

3、管道的读写: 文件IO

    读: read(fd-read,buff,sizeof(buff));
    写: write(fd-write,buff,sizeof(buff));

4、关闭管道:


        close(fd);

5、卸载管道:remove();


        int remove(const char *pathname);
        功能:将指定的pathname管道文件卸载,同时
              从文件系统中删除。
        参数: ptahtname 要卸载的有名管道 
        返回值:成功 0
                失败  -1;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值