一、消息队列
消息队列:
-
将进程间通信的数据封装成消息体发送;
-
增加消息类型,可以根据消息的类型设置数据的优先级。

-
获取IPC的key值:ftok();
-
创建消息队列 :msgget();
-
发送消息队列消息: msgsnd();
-
接收消息队列消息 :msgrcv();
-
删除消息队列 : msgctl();
cpp
key_t ftok(const char *pathname, int proj_id);
功能:产生一个IPC对象key值
参数:
pathname:路径名
proj_id:项目id
返回值:
成功:key值
失败:-1
cpp
int msgget(key_t key, int msgflg);
功能:根据key值创建一个消息队列
参数:
key: IPC key值
msgflg:IPC_CREAT|0664
返回值:
成功:消息队列ID
失败:-1
cpp
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
功能:发送消息队列的消息
参数:
msqid:消息队列ID
msgp:要发送的消息体
struct msgbuf {
long mtype; /* message type, must be > 0 */ 消息类型
char mtext[1]; /* message data */ 消息正文
};
msgsz:消息正文大小
msgflg :标志位:0:默认方式发送
返回值:
成功:0
失败:-1
cpp
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
功能:操作IPC对象对应的消息队列
参数:
msqid:消息队列的id
cmd:操作方法:
IPC_STAT:获取状态操作
IPC_SET: 设置
IPC_RMID:删除操作
buf:
IPC_RMID :buff-》NULL
返回值:
成功:0
失败:-1
cpp
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);
功能:从消息队列中接收消息
参数:
msqid:消息队列ID
msgp :要接受的消息的存储位置
msgsz:消息正文的大小
msgtyp:消息类型
msgflg:标志位:0:默认方式
返回值:
成功:返回实际消息正文的大小
失败:-1
IPC对象命令:
cpp
ipcs -a
查看系统中的IPC对象
ipcrm -q msgid
ipcrm -Q msgkey
删除消息队列
二、共享内存
共享内存:进程间效率最高的通信方式
利用内存映射技术,避免了数据的反复拷贝
cpp
int shmget(key_t key, size_t size, int shmflg);
功能:创建共享内存并获得共享内存的id
参数:
key :IPC对象key值
size:共享内存的大小(PAGE_SIZE(4096字节)整数倍)
shmflg: IPC_CREAT | 0664
返回值:
成功:共享内存的ID
失败:-1
cpp
void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:建立共享内存和用户空间的内存映射
参数:
shmid:共享内存id
shmaddr:映射的用户空间首地址
NULL :由操作系统选择用户空间并以返回值的方式返回空间首地址
shmflg :
SHM_RDONLY :只读
!SHM_RDONLY :读写
返回值:
成功:映射的用户空间首地址
失败:(void *)-1
cpp
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:操作共享内存
参数:
shmid:共享内存id
cmd:操作指令
IPC_RMID: 删除操作
buf: NULL
返回值:
成功:0
失败:-1
ipcs -a
查看IPC对象。
ipcrm -m shmid
ipcrm -M shmkey
删除共享内存