首页 > 代码库 > sysv-IPC-消息队列
sysv-IPC-消息队列
#include <sys/ipc.h>#include <sys/msg.h>/* 创建消息队列 key:由ftok创建 msgflg:消息队列访问权限 perm & ~umask umask: IPC_CREAT 如果key不存在,则创建,否则返回id IPC_EXCL 如果key存在,则返回失败 IPC_NOWAIT 如果需要等待则直接放回错误*/int msgget(key_t key, int msgflg);/* 消息队列属性控制 msgqid:消息队列标示符 cmd:要要执行的操作 IPC_STAT 读取消息队列的数据结构msqid_ds,并将其存储在buf指定的地址中。 IPC_SET 设置消息队列的数据结构msqid_ds中的ipc_perm元素的值。这个值取自buf参数。 IPC_RMID 从系统内核中移走消息队列。 buf:是一个临时的msqid_ds结构体类型的变量,用于存储读取的消息队列属性或者需要修改的消息队列属性*/int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>struct msgbuf { long mtype; /* 消息类型,必须 > 0 */ char mtext[1]; /* 消息文本 */};/* 发送函数 msqid:消息队列标示符 msgp:缓冲区,类型如msgbuf msgsz:接受信息的大小 msgflg:指定到到达系统为消息队列所定界限(如达到字数限制)时应采取的操作 如果设置成IPC_NOWAIT,如果需要等待,则不发送消息并且调用进程立即返回错误信息EAGRIN 如果设置为0,则阻塞调用进程 成功返回0,否则-1*/int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);/* 发送函数 msqid:消息队列标示符 msgp:缓冲区,类型如msgbuf msgsz:接受信息的大小 msgtype:指定请求的消息类型 =0 接收队列中第一条消息,任意类型 >0 接受第一条msgtype的消息 <0 接受第一条最低类型的消息(小于或者等于msgtype绝对值)的消息 msgflg:指定到到达系统为消息队列所定界限(如达到字数限制)时应采取的操作 如果设置成IPC_NOWAIT,如果需要等待,则不发送消息并且调用进程立即返回错误信息EAGRIN 如果设置为0,则阻塞调用进程 成功返回0,否则-1*/int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtype, int msgflg);
一个例子:
//sender#include<stdio.h>#include<stdlib.h>#include<sys/ipc.h>#include<sys/msg.h>#include<string.h>struct msgbuf{ long type;char ptr[0];};int main(int argc,char *argv[]){ key_t key; key=ftok(argv[1],100); int msgid; msgid=msgget(key,IPC_CREAT|0666); while(1){ printf("enter the msg to send:"); char buf[128];fgets(buf,128,stdin); struct msgbuf *ptr=malloc(sizeof(struct msgbuf)+strlen(buf)+1); ptr->type=1; buf[strlen(buf)-1] = ‘\0‘; strcpy(ptr->ptr,buf); printf("%s\n",buf); msgsnd(msgid,ptr,sizeof(struct msgbuf)+strlen(buf)+1,0); free(ptr); }}//receiver#include<stdio.h>#include<stdlib.h>#include<sys/ipc.h>#include<sys/msg.h>#include<string.h>struct msgbuf{ long type; char ptr[0];};int main(int argc,char *argv[]){ key_t key; key=ftok(argv[1],100); int msgid; msgid=msgget(key,IPC_CREAT|0666); pid_t pid; struct msgbuf{ long type; char ptr[1024]; }; while(1) { struct msgbuf mybuf; memset(&mybuf,‘\0‘,sizeof(mybuf)); msgrcv(msgid,&mybuf,1024,1,0); //recv msg type=1 printf("recv msg:%s, %d\n",mybuf.ptr,mybuf.type); }}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。