管道
匿名管道、命名管道
凯玲之恋的博客给出了管道在父子进程间传递的示意图,以及实现细节示意图。可以阅读。
abcfy2指出管道的几个特点:
- 管道连接的几个命令是并行执行的,而不是串行
- 管道中有任意一个命令退出时,整个管道连接的所有命令将全部退出
- 管道的退出码是最后一条命令的退出码
ty-chen分析了匿名管道的原理是利用文件系统,并给出了管道创建后的示意图:
代码的案例
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位的。
本文还给出了完整的实践:
- 调用ftok获取key,并赋予shmget创建共享内存,再调用shmat挂载。创建后的共享内存不能马上访问,必须再挂载。
- shmdt可以取消挂载,而shmctl使用
ret = shmctl(shmid , IPC_RMID , NULL);
可以删除共享内存。通常子进程取消挂载即可,而父进程负载删除。
关于IPC_RMID选项:
在调用shmctl函数指定IPC_RMID删除共享内存时,如果该共享内存的挂接次数(attach)为0,那么将会执行删除操作;如果当前还有进程在使用该共享内存(attach不为0),那么将会在所有进程调用shmdt与共享内存分离后再执行删除操作。