【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
-
管道
int pipe(int fd[2]);
只能用户父子进程,且为半双工管道,多用于shell。不能直接设置为非阻塞,需要调用fcntl()。管道发送消息时需要接收端处于接收状态,不然消息发送无效。
-
有名管道
int mkfifo(const char *filename,mode_t mode);
不仅可用于父子进程,亦可用于没有关系进程间通信。
mode 可为: 默认指定 O_CREAT | O_EXCL,指如果存在返回EEXIST错误,不存在则创建管道。
调用open时可以指定非阻塞。
方法一:
fd = open(FIFONAME,O_WRONLY | NONBLOCK,0);
方法二:
int flags;
if(flags = fcntl(fd,F_GETFL,0) < 0)
err_sys("F_GETFL error!");
flags |= NONBLOCK;
if(fcntl(fd,F_SETFL,flags) < 0)
err_sys("F_SETFL error!");
-
消息队列
消息队列是由内核维护的消息链表,拥有写权限的可以向链表中添加消息,拥有读权限的可以从链表中读取消息。消息队列具有随内核持续性,亦即进程发出消息后消亡,消息依旧存在。除非显示的删除消息。同时,消息队列无需接收端处于准备接收状态。
消息队列由链表维护,表头有两个属性:最大消息数、每个消息的最大大小。
打开一个已经存在的消息队列:
#include <mqueue>
mqd_t mq_open(const char* name,int flag);//失败返回-1
name为文件名;
flag : O_RDONLY、O_WRONLY、O_RDWR 之一 | O_CREAT | O_EXCL |O_NONBLOCK。
关闭一个消息队列:
#include<mqueue>
int mq_close(mqd_t mqdes);//返回:成功 0 ,失败 -1
消息队列并不从系统中删除,一个进程终止时,它所有打开着的消息队列都会关闭,但不会从系统中删除。引用计数
从系统中删除队列:
#include <mqueue.h>
int mq_unlink(const char* name); //返回:成功 0 ,失败 -1
每一个消息队列都保存着一个当前打开着描述符的引用计数,