学习API当然用man喽。
API:
#include <sys/types.h>buf:临时的 msqid_ds 结构体类型的变量。用于存储读取的消息队列属性或需要修改的消息队列属性。
举例:msgctl(qid, IPC_RMID, NULL) //删除消息队列
看了API,就可以写两个进程跑一下了。
process1
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #define MY_MSG_TYPE 0xaabb struct msg { long msg_types; char msg_buf[3]; }; static key_t mykey = 0x1234; static char buf[5][3] = { { ‘a‘, ‘b‘, ‘c‘}, { ‘d‘, ‘e‘, ‘r‘}, { ‘g‘, ‘h‘, ‘i‘}, { ‘j‘, ‘k‘, ‘l‘}, { ‘m‘, ‘n‘, ‘o‘} }; int main() { struct msg pmsg; int msgid; int i; int ret; printf("process send start\n"); i = 0; msgid = msgget(mykey, IPC_CREAT | 00666); if (msgid < 0) { printf("creat msg failed\n"); return 0; } pmsg.msg_types = MY_MSG_TYPE; while (1) { memcpy(&pmsg.msg_buf, &(buf[i][0]), 3); printf("msgid %d pmsg.msg_buf %c %c %c\n", msgid, pmsg.msg_buf[0], pmsg.msg_buf[1], pmsg.msg_buf[2]); ret = msgsnd(msgid, &pmsg, 3, IPC_NOWAIT); if (ret < 0) { switch (errno) { case E2BIG: printf("<xmpp>1111消息文本长度大于msgsz,并且msgflg中没有指定MSG_NOERROR\n"); break; case EACCES: printf("<xmpp>2222调用进程没有读权能,同时没具有CAP_IPC_OWNER权能\n"); break; case EAGAIN: printf("<xmpp>3333消息队列为空,并且msgflg中没有指定IPC_NOWAIT\n"); break; case EFAULT: printf("<xmpp>444msgp指向的空间不可访问\n"); break; case EIDRM: printf("<xmpp>555当进程睡眠等待接收消息时,消息队列已被删除\n"); break; case EINTR: printf("<xmpp>666当进程睡眠等待接收消息时,被信号中断\n"); break; case EINVAL: printf("<xmpp>777 inval\n"); break; case ENOMSG: printf("<xmpp>888msgflg中指定了IPC_NOWAIT,同时所请求类型的消息不存在\n"); break; default: printf("<xmpp>999其他错误\n"); break; } break; } i++; if (i >= 5) { i = 0; } sleep(3); } msgctl(msgid, IPC_RMID, NULL); return 0; }
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #define MY_MSG_TYPE 0xaabbccdd struct msg { long msg_types; char msg_buf[3]; }; static key_t mykey = 0x1234; int main() { struct msg pmsg; int msgid; int i; ssize_t ret; printf("process receive start\n"); printf("aaaaaaaaaaaaaaaaaa\n"); i = 0; msgid = msgget(mykey, IPC_CREAT | 00666); if (msgid < 0) { printf("GET MSG FAILE\n"); return 0; } printf("!!!!\n"); while (1) { ret = msgrcv(msgid, &pmsg, 3, MY_MSG_TYPE, 0); if (ret < 0) { printf("receive error!!!\n"); } else { printf("get message ret = %d %c %c %c\n", ret, pmsg.msg_buf[0], pmsg.msg_buf[1], pmsg.msg_buf[2]); } sleep(1); } msgctl(msgid, IPC_RMID, NULL); return 0; }
就会有打印了
.out main.c
[chenct@localhost p1]$ ./a.out
process send start
msgid 884736 pmsg.msg_buf a b c
get message ret = 3 a b c
成功。
原文:http://blog.csdn.net/todo_cct/article/details/20926933