概念
消息队列,用于从一个进程向另一个进程发送数据。但仅把数据发送到一个“队列”中,而不指定由哪个进程来接受。
system v消息队列
消息队列,独立与发送消息的进程和接收消息的进程。信号、管道、命名管道都不独立与发送和接收进程。
消息队列,有最大长度限制:MSGMNB;消息队列中的单条消息,也有最大长度限制:MSGMAX
相关函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
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 msgtype, int msgflg);
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
|
2个进程通信
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h>
#define MSG_SIZE 80
struct my_msg_st { long int msg_type; char msg[MSG_SIZE]; };
int main(void) { int msgid; int ret; struct my_msg_st msg;
msgid = msgget((key_t)1235, 0666|IPC_CREAT); if (msgid == -1) { printf("msgget failed!\n"); exit(1); }
msg.msg_type = 1; strcpy(msg.msg, "main1 say Hello world1 !"); ret = msgsnd(msgid, &msg, MSG_SIZE, 0); if (ret == -1) { printf("msgsnd failed!\n"); exit(1); }
sleep(5);
strcpy(msg.msg, "main1 say Hello world2 !"); ret = msgsnd(msgid, &msg, MSG_SIZE, 0); if (ret == -1) { printf("msgsnd failed!\n"); exit(1); }
return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h>
#define MSG_SIZE 80
struct my_msg_st { long int msg_type; char msg[MSG_SIZE]; };
int main(void) { int msgid; int ret; struct my_msg_st msg;
msgid = msgget((key_t)1235, 0666|IPC_CREAT); if (msgid == -1) { printf("msgget failed!\n"); exit(1); }
msg.msg_type = 0; ret = msgrcv(msgid, &msg, MSG_SIZE, 0, 0); if (ret == -1) { printf("msgrcv failed!\n"); exit(1); }
printf("main2 received: %s\n", msg.msg);
ret = msgctl(msgid, IPC_RMID, 0); if (ret == -1) { printf("msgctl(IPC_RMID) failed!\n"); exit(1); }
return 0; }
|
posix 消息队列
相关函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
mqd_t mq_open(const char* name, int oflag); mqd_t mq_open(const char* name, int oflag, mode_t mode, struct mq_attr* attr);
mqd_t mq_close(mqd_t mqdes);
mqd_t mq_unlink(const char* name);
mqd_t mq_getattr(mqd_t mqdes, struct mq_attr* attr); mqd_t mq_setattr(mqd_t mqdes, struct mq_attr* newatr, struct mq_attr* oldattr);
mqd_t mq_send(mqd_t mqdes, const char* msg_ptr, size_t msg_len, unsigned msg_prio);
ssize_t mq_receive(mqd_t mqdes, char* msg_ptr, size_t msg_len, unsigned* msg_prio);
mqd_t mq_notify(mqd_mqdes, const struct sigevent* notification);
|