IPC-msg 消息队列
2011-08-27 20:40
337 查看
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);
[root@localhost ch14]# cat msg1.c /* Here's the receiver program. */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/msg.h> struct my_msg_st { long int my_msg_type; char some_text[BUFSIZ]; }; int main() { printf("BUFSIZ:%d\n",BUFSIZ); int running = 1; int msgid; struct my_msg_st some_data; long int msg_to_receive = 0; /* First, we set up the message queue. */ msgid = msgget((key_t)1234, 0666 | IPC_CREAT); if (msgid == -1) { fprintf(stderr, "msgget failed with error: %d\n", errno); exit(EXIT_FAILURE); } /* Then the messages are retrieved from the queue, until an end message is encountered. Lastly, the message queue is deleted. */ while(running) { if (msgrcv(msgid, (void *)&some_data, BUFSIZ, msg_to_receive, 0) == -1) { fprintf(stderr, "msgrcv failed with error: %d\n", errno); exit(EXIT_FAILURE); } printf("You wrote: %s", some_data.some_text); if (strncmp(some_data.some_text, "end", 3) == 0) { running = 0; } } if (msgctl(msgid, IPC_RMID, 0) == -1) { fprintf(stderr, "msgctl(IPC_RMID) failed\n"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } [root@localhost ch14]# [root@localhost ch14]# cat msg2.c /* The sender program is very similar to msg1.c. In the main set up, delete the msg_to_receive declaration and replace it with buffer[BUFSIZ], remove the message queue delete and make the following changes to the running loop. We now have a call to msgsnd to send the entered text to the queue. */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/msg.h> #define MAX_TEXT 512 struct my_msg_st { long int my_msg_type; char some_text[MAX_TEXT]; }; int main() { int running = 1; struct my_msg_st some_data; int msgid; char buffer[BUFSIZ]; msgid = msgget((key_t)1234, 0666 | IPC_CREAT); if (msgid == -1) { fprintf(stderr, "msgget failed with error: %d\n", errno); exit(EXIT_FAILURE); } while(running) { usleep(1000);//1ms printf("Enter some text: "); fgets(buffer, BUFSIZ, stdin); some_data.my_msg_type = 1; strcpy(some_data.some_text, buffer); if (msgsnd(msgid, (void *)&some_data, MAX_TEXT, 0) == -1) { fprintf(stderr, "msgsnd failed\n"); exit(EXIT_FAILURE); } if (strncmp(buffer, "end", 3) == 0) { running = 0; } } exit(EXIT_SUCCESS); } [root@localhost ch14]#
[root@localhost ch14]# ./msg1& [2] 6998 [root@localhost ch14]# BUFSIZ:8192 ./msg2 Enter some text: hello You wrote: hello Enter some text: en You wrote: en Enter some text:在msg2的msgsnd还未执行时,msg1的msgrcv会自动阻塞
待msgsnd执行时,进程msg1被cpu自动唤醒以执行msgrcv
相关文章推荐
- IPC 消息队列 msg
- 消息队列(Message Queues)有关的数据结构 ipc_perm msgbuf msg msqid_ds
- IPC主题一 :消息队列(msg)
- 深入理解Linux进程间通信(IPC)-- 消息队列msg
- linux IPC -msg 消息队列
- 进程间通信(IPC)之――――消息队列
- Linux C 进程间的IPC通信 之 消息队列(2)
- IPC-----POSIX消息队列
- IPC通信:Posix消息队列读,写
- IPC之消息队列详解
- 消息队列ipc:ftok,msgget,msgsnd,msgrcv,msgctl
- Linux XSI IPC 之消息队列
- IPC之消息队列(4)
- IPC通信之消息队列、信号量和共享内存
- 进程间通信--消息队列(msg)--实现自由通信
- 利用消息队列来实现IPC
- IPC---消息队列
- Linux _msg 消息队列 demo
- Linux进程通信IPC--消息队列MessageQueue
- Linux — IPC进程通信之消息队列详解