分类: LINUX
2013-04-22 15:26:47
消息队列就是一些消息的列表,(以下称msg)用户可以在msg中添加消息和读取消息等。它具有一定的fifo特性,但它可以实现消息的随机查询,比fifo更有优势。同时这些消息存在于内核中,由队列id来标识。
基
本操作的函数有:调用msgget函数创建或打开msg,创建的msg数量会受到系统msg数量的限制;调用msgsnd添加消息,它把消息添加到已打开
msg的末尾;调用msgrcv来读取消息,它把消息从msg中移走,与fifo不同的是,这里可以取走指定的某一条消息;控制msg的是msgctl函
数,它可以完成多项功能。
函数原型是:
#include
#include
#include
int msgget(key_t key, int msgflg);
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
若两个没有关系的进程通过msg通信,注意在各自进程中用msgget时的key值必须一致,即用ftok生成key时,参数需一致,比如都用key_t key = ftok(".", 'a');
下面看个例子,有两个程序:msgsnd.c 和 msgrcv.c
msgsnd.c
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9
10 #define N 64
11
12 typedef struct {
13
14 long mtype;
15 char mtext[N];
16 }MSG;
17
18 int main()
19 {
20 key_t key;
21 int msgid;
22 MSG msg;
23
24 if((key = ftok(".", 'a')) < 0)
25 { perror("ftok error");
26 exit(-1);
27 }
28 else
29 { printf("key value is %x\n", key); }
30
31 if((msgid = msgget(key, 0666 | IPC_CREAT)) < 0)
32 { perror("msgget error\n");
33 exit(-1);
34 }
35 else
36 { printf("msgget success, id is %d\n", msgid); }
37
38
39
40 while(1)
41 {
42 printf("input some message:\n");
43 if(fgets(msg.mtext, N, stdin) == NULL)
44 { printf("no message\n");
45 exit(-1);
46 }
47 msg.mtype = getpid();
48
49 if(msgsnd(msgid, &msg, strlen(msg.mtext), 0) < 0)
50 { perror("msgsnd error");
51 exit(-1);
52 }
53 else
54 { printf("message added to msg, is %s\n", msg.mtext); }
55
56 if(strncmp(msg.mtext, "quit", 4) == 0)
57 { break; }
58
59 }
60
61
62 exit(0);
63
64
65 } (完)
msgrcv.c