标签:blog http io 数据 ar 2014 div amp
#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);
}
}
标签:blog http io 数据 ar 2014 div amp
原文地址:http://www.cnblogs.com/dy-techblog/p/3923619.html