消息队列
个人理解消息队列就是以用户定义的type作为数据类型的,一个系统维护的链表,不同进程可以进行读写
涉及到的api如下:
key_t ftok(char *pathname, prj_id)//获取可以值
int msgget(key_t key, int msgflg)//通过key 获取msg的id
int msgctl(int msgqid, int command, struct msgqid_ds *buf)
其中command//仅说明通用的,linux特有的没管
IPC_STAT:获取共享内存的当前信息,存储在buf中
IPC_SET:设置共享内存buf中的 部分信息
IPC_RMID:给共享内存加个标志,在所有进程与共享内存分离后删除之,需要创建该共享内存的成员或者有权限者
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);//msgtyp表示接受type的类型,为0表示所有的都接收
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);//注意发送时候 msgp的类型(第一个long变量)必须大于0
void *msgp使用户定义的数据结构,结构如下
struct mymessageStruct {
long mytypeName; //数据结构类型
char mydataName[num];//数据内容 num可以是任意大小
};
|
测试代码如下:
-
#include <stdio.h>
-
#include <sys/msg.h>
-
#include <sys/ipc.h>
-
#include <unistd.h>
-
-
#define MESSAGE_LEN 100
-
-
struct msg_buff//定义消息队列中的一个数据类型的空间
-
{
-
long m_type;
-
char m_data[MESSAGE_LEN];
-
};
-
-
int init_message(char *fileName)//初始化消息队列
-
{
-
int msgid;
-
key_t key;
-
-
key = ftok(fileName, 1);
-
if (key < 0) {
-
perror("ftok()");
-
}
-
-
msgid = msgget(key, IPC_CREAT | 0600);
-
if (msgid < 0) {
-
perror("msgget");
-
}
-
-
return msgid;
-
}
-
-
-
int main(int argc, char **argv)
-
{
-
pid_t pid;
-
-
if ((pid = fork()) < 0) {
-
perror("fork()");
-
} else if (pid == 0) { //child
-
int msgid;
-
struct msg_buff sb, rb;
-
-
msgid = init_message("/tmp/1");//初始化
-
sprintf(sb.m_data, "wwww in child");
-
sb.m_type = 1;
-
while (1) {
-
if (msgsnd(msgid, &sb, MESSAGE_LEN, 0) < 0) {//发送数据
-
perror("msgsnd()");
-
}
-
if (msgrcv(msgid, &rb, MESSAGE_LEN, 0, 0) < 0) {//接收数据,接收所有数据类型的数据,没有数据会阻塞
-
printf("do not read in child\n");
-
} else {
-
printf("child read: %ld, %s\n", rb.m_type, rb.m_data);
-
}
-
-
sleep(1);
-
sb.m_type++;//换个数据类型,测试下数据类型的影响
-
}
-
} else { //parent
-
int msgid;
-
struct msg_buff sb, rb;
-
-
msgid = init_message("/tmp/1");
-
sprintf(sb.m_data, "wwww in parent");
-
sb.m_type = 1;
-
while (1) {
-
msgsnd(msgid, &sb, MESSAGE_LEN, 0);
-
if (msgrcv(msgid, &rb, MESSAGE_LEN, 1, IPC_NOWAIT) < 0) {//仅接收type为1的数据类型的数据,非阻塞方式接收
-
perror("recv");
-
} else {
-
printf("parent read: %ld, %s\n", rb.m_type, rb.m_data);
-
}
-
-
sleep(3);
-
sb.m_type++;
-
}
-
}
-
-
return 0;
-
}
阅读(1481) | 评论(0) | 转发(0) |