put rpi 控制 rcv too number 获取 scan
1.消息队列结构体的定义
typedef struct{ uid_t uid; /* owner`s user id */ gid_t gid; /* owner`s group id */ udi_t cuid; /* creator`s user id */ gid_t cgid; /* creator`s group id */ mode_t mode; /* read-write permissions 0400 MSG_R 0200 MSG_W*/ ulong_t seq; /* slot usage sequence number*/}ipc_perm;
typedef stuct{ struct ipc_perm msg_perm; /* read_write perms */ struct msg *msg_first; /* ptr to first message on queue */ struct msg *msg_last; /* ptr to last message on queue */ msglen_t msg_cbytes; /* used bytes current on queue */ msgqnum_t msg_qnum; /* current num of message on queue */ msglen_t msg_qbytes; /* max # of bytes allowed on queue */ pid_t msg_lspid; /* pid of last msgsnd() */ pid_t msg_lrpid; /* pid of last msgrcv() */ time_t msg_stime; /* time of last msgsnd() */ time_t msg_rtime; /* time of last msgrcv() */ time_t msg_ctime; /* time of last msgctl() */}msqid_ds;
typedef struct{ long mtype; char mbuf[MSGLEN];}Message;
2.创建消息队列:
/***************************************************Function: int msgget(ket_t key,int oflag);Explain: create or view a message queueReturn : a int indetifyInclude: sys/msg.hintroduction: oflag: 0400 msg_r 0200 msg_w 0600 msg_wr ipc_creat: NO exist and then creat a queue exist : reference a queue ipc_creat|ipc_excl: NO exist and then creat a queue exist : return error****************************************************/#include
int MsgGet(int key){ int ret; ret=msgget(key,0600|IPC_CREAT);// ret=msgget(key,0600|IPC_CREAT|IPC_EXCL); if(ret<0) perror("creat msgid error"); printf("msgid=%d/n",ret); system("ipcs -q -i ret"); return ret;}int main(int argc,char *agrv[]){ int key; printf("pleasse input msgkey:"); scanf("%d",&key); MsgGet(key); return 0;}
3.向消息队列中发送消息msgsnd
/***********************************************************************************Function: int msgsnd(int msqid,const void *ptr,size_t length,int flag)Explain: send a message to a queueReturn: len: send message len;Include: sys/msg.hIntroduction: flag: 0 : if queue full wait:1>具备存放新消息的空间 2>由msqid标识的消息队列从系统中删除(返回EIDRM错误) 3>调用线程被某个捕获的信号所中断(返回EINTR错误) IPC_NOWAIT:如果没有存放新消息的空间,函数马上返回 1>指定的队列中有太多的字节 2>在系统范围存在太多的消息*****************************************************************************************/#include "typemsg.h"int MsgSnd(int msqid,char *buf,int len,int flag){ int ret; ret=msgsnd(msqid,buf,len,flag); if(ret<0) perror("msgsnd error"); system("ipcs -q"); return ret;}
int main(){ int msqid,len,stype; Message msgb; memset(&msgb,0,sizeof(Message)); printf("msgsnd:please input msqid:"); scanf("%d",&msqid); printf("please input msgtype:"); scanf("%d",&stype); msgb.mtype=stype; strcpy(msgb.mbuf,"zhangweia"); MsgSnd(msqid,(char *)&msgb,sizeof(Message),0); return 0;}
4.从队列中获取消息 msgrcv
/*********************************************************************Function: int msgrcv(int msqid,const void *ptr,size_t msglen,long type,int flag)Explain: recv message order by type msgrcv error: Argument list too long --> msglen的长度小于消息体中消息的长度Para : ptr: point to message struct msglen: 由ptr指向的缓冲区中数据部分的大小,这个是该函数能够返回的最大数据量 type: message type;
1> 0:返回队列中最早的消息 2> 大于0:返回消息队列中类型为type的第一个消息 3> 小于0:返回消息队列中类型小于或者等于type的绝对值的消息类型中最小的第一个消息 flag: 0
}
int main(){ int msqid,len; long ttype; Message mbuf; printf("msgrcv:please input recv msqid:"); scanf("%d",&msqid); MsgRcv(msqid,(char *)&mbuf,8900,0,IPC_NOWAIT); printf("recv message=%s/n",mbuf.mbuf); Put_String((unsigned char *)&mbuf,sizeof(Message)); return 0;}
6.消息队列的控制msgctl
/**********************************************************Function: int msgctl(int msqid,int cmd,struct msqid_ds *buff)Explain: cdm: IPC_RMID; delete msqid IPC_SET: IPC_STAT: return msqid stat
*********************************************************/#include "typemsg.h"int MsgCtl(int msqid,int cmd,struct msqid_ds *buff){ int ret; ret=msgctl(msqid,cmd,buff); if(ret<0) { perror("msgctl error"); return -1; } return 0;}
int main(){ int msqid,type; struct msqid_ds info; printf("please input msqid /nand type(1:icp_rmid;2:ipc_stat)"); scanf("%d%d",&msqid,&type); if(type==1) { MsgCtl(msqid,IPC_RMID,NULL); printf("delete queue success:%d/n",msqid); }else if(type==2) { MsgCtl(msqid,IPC_STAT,&info); printf("get queue stat:%d/n",msqid); } return 0;
}
消息队列函数
来源: http://www.bubuko.com/infodetail-2116342.html