linux进程通信 管道、消息队列、信号量、共享内存

管道

匿名管道、命名管道
凯玲之恋的博客给出了管道在父子进程间传递的示意图,以及实现细节示意图。可以阅读。
abcfy2指出管道的几个特点:

  • 管道连接的几个命令是并行执行的,而不是串行
  • 管道中有任意一个命令退出时,整个管道连接的所有命令将全部退出
  • 管道的退出码是最后一条命令的退出码

ty-chen分析了匿名管道的原理是利用文件系统,并给出了管道创建后的示意图:

linux之dup和dup2函数解析
内核结构

代码的案例
Schwarzeni给出了代码的案例,其中用到了STDOUT_FILENO。还给出了命名管道popen的案例。
stdout和STDOUT_FILENO区别
The difference between stdout and STDOUT_FILENO提到,stdout是FILE *类型,而STDOUT_FILENO是int类型,指stdout对应的文件描述符号。

systemV

消息队列

Linux进程间通信二 System V 消息队列简介与示例 举例用各种函数能进行消息队列通信。

信号量

略,懒得看。信号量不是信号,前者是Semaphore,后者是signal(比如SIGINT什么的)。一般会和共享内存配合使用,因为共享内存在多线程访问下会有竞争条件。

共享内存

demo1 http://hildstrom.com/projects/ipc_sysv_posix/index.html
ftok
linux ftok官方手册指出生成一个ID需要两个参数,分别是路径和proj_id,返回的是这段内存的key。实际上就是根据这两个的复合来获取同一个共享内存,当路径与proj_id相同时,key相同。

System V 共享内存(一) 给出了具体用法(其实proj_id随便填,只要使用这段共享内存的代码都保持一致即可)。

shmget
linux shmget官方手册给出了关于shmflg参数的各种选项,比如常用的IPC_CREAT IPC_EXCL 等。
另外,最低的9个位是用来指定权限的。

In addition to the above flags, the least significant 9 bits of shmflg specify the permissions granted to the owner, group, and others.

linux进程间通信-----System V共享内存总结实例给出了具体的案例,其中使用到了经典shmflg选项的组合:

int shmid = shmget(key, SHMSIZE, IPC_CREAT|0666);

在这句代码中,0666代表8进制的666(在10进制下是73, 在2进制下是110110110,也就是说owner、group和其它用户都有读写权),它指定了最低的9位bit。而其它选项都是高于9位的。

本文还给出了完整的实践:

  1. 调用ftok获取key,并赋予shmget创建共享内存,再调用shmat挂载。创建后的共享内存不能马上访问,必须再挂载。
  2. shmdt可以取消挂载,而shmctl使用ret = shmctl(shmid , IPC_RMID , NULL);可以删除共享内存。通常子进程取消挂载即可,而父进程负载删除。

关于IPC_RMID选项:

在调用shmctl函数指定IPC_RMID删除共享内存时,如果该共享内存的挂接次数(attach)为0,那么将会执行删除操作;如果当前还有进程在使用该共享内存(attach不为0),那么将会在所有进程调用shmdt与共享内存分离后再执行删除操作。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值