消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点。作为早期unix通信机制之一的信号能够传送的信息量有限,后来虽然POSIX 1003.1b在信号的实时性方面作了拓广,使得信号在传递信息量方面有了相当程度的改进,但是信号这种通信方式更像"即时"的通信方式,它要求接受信号的进程在某个时间范围内对信号做出反应,因此该信号最多在接受信号进程的生命周期内才有意义,信号所传递的信息是接近于随进程持续的概念(process-persistent),管道及有名管道及有名管道则是典型的随进程持续IPC,并且,只能传送无格式的字节流无疑会给应用程序开发带来不便,另外,它的缓冲区大小也受到限制。
详见: http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
- #include <error.h>
-
- #define BUFFER 10 //定义buf大小
-
- struct msgtype {
- long mtype;
- char buf1[BUFFER + 1];
- char buf2[BUFFER + 1];
- long size;
- };
-
- int main()
- {
- key_t msgkey;
-
-
- int msgid;
- struct msgtype msg;
-
- msgkey = ftok("/home/zhang/shmipcx", 10001);
- if(msgkey == -1)
- {
- perror("ftok");
- exit(1);
- }
-
-
- msgid = msgget(msgkey, IPC_CREAT | 0666);
- if(msgid == -1)
- {
- perror("msgget");
- exit(1);
- }
-
- int i = 0;
- while(i < 10)
- {
- memset(msg.buf1, 0, BUFFER + 1);
- memset(msg.buf2, 0, BUFFER + 1);
-
- sprintf(msg.buf1, "buf1_0x%x", i);
- sprintf(msg.buf2, "buf2_0x%x", i + ‘a‘);
-
- msg.mtype = 1001;
- msg.size = i;
-
- printf("msg.mtype = %ld, msg.size = %ld\t", msg.mtype, msg.size);
- printf("msg.buf1 = %s, msg.buf2 = %s\n", msg.buf1, msg.buf2);
-
-
-
-
-
-
- if(msgsnd(msgid, &msg, sizeof(struct msgtype) - sizeof(long), 0) == -1)
- {
- perror("msgsnd");
- exit(1);
- }
-
- i++;
- sleep(1);
- }
-
- sleep(30);
-
-
-
-
- if(msgctl(msgid, IPC_RMID, 0) == -1)
- {
- perror("msgctl");
- exit(1);
- }
-
- return 0;
- }
-
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
- #include <error.h>
-
- #define BUFFER 10 //定义buf大小
-
- struct msgtype {
- long mtype;
- char buf1[BUFFER + 1];
- char buf2[BUFFER + 1];
- long size;
- };
-
- int main()
- {
- key_t msgkey;
-
-
- int msgid;
- struct msgtype msg;
-
-
- msgkey = ftok("/home/zhang/shmipcx", 10001);
- if(msgkey == -1)
- {
- perror("ftok");
- exit(1);
- }
-
- msgid = msgget(msgkey, IPC_EXCL | 0666);
- if(msgid == -1)
- {
- perror("msgget");
- exit(1);
- }
-
- int i = 0;
-
- while(i < 10)
- {
- memset(msg.buf1, 0, BUFFER + 1);
- memset(msg.buf2, 0, BUFFER + 1);
- msg.mtype = 1001;
- msg.size = -1;
-
-
-
-
-
-
-
-
-
-
-
- if(msgrcv(msgid, &msg, sizeof(struct msgtype) - sizeof(long), msg.mtype, 0) == -1)
- {
- perror("msgrcv");
- exit(1);
- }
-
- printf("msg.mtype = %ld, msg.size = %ld\t", msg.mtype, msg.size);
- printf("msg.buf1 = %s, msg.buf2 = %s\n", msg.buf1, msg.buf2);
-
- i++;
- sleep(2);
- }
-
- return 0;
- }
消息队列非阻塞,布布扣,bubuko.com
消息队列非阻塞
原文:http://www.cnblogs.com/pengkunfan/p/3816540.html