多进程(五)
进程间通信
消息队列
消息队列是一种进程间通信机制,它允许两个或多个进程之间进行通信。
消息队列的实现依赖于操作系统提供的消息队列机制,它可以实现不同进程之间的数据交换。
IPC : Inter-Process Communication (进程间通讯)
System V是早期的UNIX系统,曾经被成为AT & T System V,是unix操作系统中比较重要的一个分支
现在的Linux操作系统也支持System V IPC
System V IPC 对象共有三种:
消息队列
共享内存
信号量
System V IPC是由内核维护的若干个对象,通过ipcs命令查询
每个IPC对象都有自己的唯一ID,可以通过ftok()函数生成IPC对象的ID
消息队列是属于 sytem ipc 的⼀种, 由内核维护与管理 可以通过 ipcs -q 查看
ftok()函数
函数头文件:
#include <sys/ipc.h>
函数原型:
key_t ftok(const char *pathname, int proj_id);
参数说明:
-
pathname: 要生成IPC对象的路径名
-
proj_id: 项目ID,用于区分不同IPC对象
-
每个存在的文件都有一个id,叫做inode节点号,可以通过ll 命令查询
-
inode节点号 + proj_id(低8bit) 生成key_t类型的值,作为IPC对象的ID
-
key_t类型的值可以用ftok()函数生成,也可以用mkkey()函数生成
函数返回值:
- 成功: 返回一个key_t类型的整数,该整数是IPC对象的ID
- 失败: 返回-1,并设置errno
创建消息队列
函数头文件:
#include <sys/msg.h>
#include <sys/types.h>
#include <sys/ipc.h>
函数原型:
int msgget(key_t key, int msgflg);
参数说明:
- key: 要生成IPC对象的ID
- msgflg: 标志位,用于设置消息队列的访问模式,可取值如下:
- IPC_CREAT: 如果key对应的消息队列不存在,则创建该消息队列
- IPC_EXCL: 如果key对应的消息队列已经存在,则返回错误
- 0: 打开已存在的消息队列
- 权限控制标志: 如0666,表示创建的消息队列具有读写权限
函数返回值:
- 成功: 返回消息队列的ID
- 失败: 返回-1,并设置errno
创建消息队列示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
//创建消息队列
#define MSG_PATH "."
#define MSG_ID 88
int main(){
key_t key;//消息队列的key
key= ftok(MSG_PATH,MSG_ID);//通过文件路径和ID生成key
if(key==-1){
printf("ftok()");
exit(EXIT_FAILURE);
}
int msgid= msgget(key,IPC_CREAT|0666);//创建消息队列
if(msgid==-1){
printf("msgget()");
exit(EXIT_FAILURE);
}
printf("Message Queue ID: %d\n",msgid);
return 0;
}
运行结果:
msgctl 函数
功能: 操作消息队列
函数头文件: