学习笔记之进程间的通讯之管道

1、进程间的通讯方式:

①,管道(管道命令,匿名管道,有名管道)
②,消息队列
③,共享内存
④,内存映射
⑤,信号
⑥,信号量
⑦,socket网络通讯

2、管道pipe

 管道是内存中的一块临时存储空间,是一个环形队列,空间大小不固定
 往管道中写数据:从用户层拷贝到内核层,内核层拷贝到内存空间 

 从管道中读数据:数据从内存拷贝到内核层,再从内核层拷贝到用户层  

  
 ①匿名管道:不属于进程,独立于进程,只能用于具有亲缘关系间的进程通讯,如父子进程

int pipefd[2]={0};//对临时空间进行标记,pipefd[0]默认对应读,pipefd[1]默认对应写,匿名描述符

pipe(pipefd);//创建匿名管道,一进一出(一写一读),类似于文件描述符操作    

 //往管道中写数据
 write(pipefd[1], caMsg, strlen(caMsg));

 //从管道中读取数据

//默认阻塞读书据,若管道中没有数据,则阻塞,直到管道中有数据到来
 read(pipefd[0], caResult, 64);

//最后记得关闭管道(同文件操作一样)

close(pipefd[0]);
close(pipefd[1]);

例子:要实现父子进程相互发送并接收信息,可以在父子各自代码区域进行管道读写,但读写操作间要sleep(1),否则就自己写的,自己读了,因为进程调度运行是基于时间片的,父进程写操作后时间片未用完,就会接着读;sleep是让写操作完就让出cpu给其他进程使用。

②有名管道:是一个特殊的(临时)文件,数据从文件中读取出来之后,就自动清除掉了

采用运行参数传入,mkfifo(argv[1],0664);//创建有名管道,argv[1]是运行时传入的文件名,0664是文件操作权限;

有名管道必须读写同时打开,才能继续往下执行

如果只是都打开或者写打开,则阻塞等待,直到管道被读写打开

有名管道可以完成非亲缘关系进程间通讯,可以一个读打开,一个写打开进行通讯,或对两个有名管道文件进行读写打开,或对一个文件读写打开,进行数据的发送和接收;

创建好有名管道文件后,操作如文件操作一样。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值