一 、SYSTEM-V IPC
1. 分类
消息对列
共享内存
信号量
2. 套路(API调用的顺序)
3. ftok函数----创建SYSTEM -V IPC 的 key值
①形参:
项目环境( pathname): 项目文件夹
在一个项目里面,所有的文件都在同一个路径里,pathname是一个路径
proj_id
IPC 的标识,表示的是key值
当路径和IPC的路径一致时,创建出来的key值是一样的。
② key的作用:
申请对应传输机制的空间资源和确定传输机制
消息对列:消息对列需要空间,确定传输机制
共享内存:共享内存需要空间,确定传输机制
③注意:
当要重复创建不同的但是有时相同IPC时,需要不同key才行。
④:
不同的key值,就可以创建多个共同的SYSTEM-V IPC
相同的key值,操作的就是一个消息对列
4.例子:
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <errno.h>
#define IPC_MASK_A 1
#define IPC_MASK_B 2
int main()
{
key_t key_a = tok("./",IPC_MASK_A)
key_t key_b = tok("./",IPC_MASK_B)
if(key_a ==-1 || key_b ==-1)
{
perror("tok");
exit(1);
}
else
{
printf("%d-----%d",key_a,key_b);
}
return 0;
}
二、消息对列
1. 用key值创建消息对列
①:msgflg是一个位屏蔽字,参数可以叠加使用,mode指的是文件的权限,例如:0666和0777一样的,因为执行权限是无效的。
2. 使用
int msg_queue_data = msgget(key_a,IPC_CREAT | 0666);
if(msg_queue_data == -1)
{
perror("msgget");
exit(-1);
}
3. 关于消息的命令
查看:ipcs -q
删除:ipcrm -q msg_id \ ipcrm -Q key
三、消息对列的发送和接受
1. 函数结构
2. 参数含义
msqid:指的是消息队列的ID号(在创建消息对列时出现,是int型)
msgp : 数据存放的地址或指针
msgsz: 大小
msgtyp: long型的标识,用来甄别信息。一般的表示方法是:1L
msgflg:将要读取和发送的信息的方式,一般为 0
四、msgctl 函数:设置消息对列相关函数
1. 图示
五、代码
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#define MSG_LENGTH 24
#define IPC_MASK_A 1
#define IPC_MASK_B 2
#define MSG_MASK 1L
struct msgbuf
{
long mtype;
char mtext[MSG_LENGTH];
}msg_inf_send,msg_inf_rev;
int main()
{
key_t key_a = ftok("./",IPC_MASK_A);
key_t key_b = ftok("./",IPC_MASK_B);
if(key_a == -1 || key_b == -1)
{
perror("ftok");
return -1;
}
else
{
printf("%d---%d\n",key_a,key_b);
}
int msg_queue_id_a = msgget(key_a,IPC_CREAT | 0666);
int msg_queue_id_b = msgget(key_b,IPC_CREAT | 0666);
if(msg_queue_id_a == -1 || msg_queue_id_b == -1)
{
perror("msgget");
return -1;
}
else
{
printf("%d---%d\n",msg_queue_id_a,msg_queue_id_b);
}
/*调用msgsnd函数发送消息*/
memset(&msg_inf_send,0,sizeof(msg_inf_send));
memset(&msg_inf_rev,0,sizeof(msg_inf_rev));
msg_inf_send.mtype = MSG_MASK;
while(1)
{
memset(msg_inf_send.mtext,0,MSG_LENGTH);
memset(msg_inf_rev.mtext,0,MSG_LENGTH);
printf("请输入要发送的消息:");
scanf("%s",msg_inf_send.mtext);
int msgsnd_ret = msgsnd(msg_queue_id_a,&msg_inf_send,strlen(msg_inf_send.mtext),0);
if(msgsnd_ret == -1)
{
perror("msgsnd");
return -1;
}
else
printf("发送消息成功!!!!\n");
sleep(1);
/*调用msgrcv读取消息*/
int msgrcv_ret = msgrcv(msg_queue_id_a,&msg_inf_rev,MSG_LENGTH,MSG_MASK,0);
if(msgrcv_ret == -1)
{
perror("msgrcv");
return -1;
}
else
printf("消息是:%s\n",msg_inf_rev.mtext);
}
return 0;
}