转载

Linux进程间通信之消息队列

马上过年了,心里万般滋味。。。

一,消息队列

1,概念:“消息队列”是在消息的传输过程中保存消息的容器

2,消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。

对消息队列 有写权限的进程 可以向消息队列中按照一定的规则 添加新消息

对消息队列 有读权限的进程 则可以从消息队列中 读走消息

消息队列是随内核持续的。

3,编程注意事项:使用时先把数据封装成消息,把消息存入队列

编程步骤: 具体函数的用法可以用 man手册查看 (强力推荐)

(1)ftok()生产key

(2)使用msgget( ) 创建/获取消息队列,返回值是队列标识符

(3)使用msgsnd( ) 发送消息

使用msgrcv( ) 接收消息

(4)使用msgctl( ) 删除消息队列

4,实例:

sendmsg.c   用来发送消息的

 // sendmsg.c  #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h> #include<string.h>  struct my_msg {     int mtype; // 消息类型     char buf[256]; }msg1, msg2;  int main() {     key_t key = ftok("./", 88);      int msgid = msgget(key, 0666|IPC_CREAT);     if(-1 == msgid)     {         perror("msgget failed!!!");         exit(1);     }      msg1.mtype = 2;     strcpy(msg1.buf, "hello, msg2");     msgsnd(msgid, &msg1, sizeof(msg1), 0); // 阻塞 //    msgsnd(msgid, &msg1, sizeof(msg1), IPC_NOWAIT); // 非阻塞      msg2.mtype = 1;     strcpy(msg2.buf, "hello, msg1");     msgsnd(msgid, &msg2, sizeof(msg2), 0); // 阻塞      printf("消息发送完成,按回车销毁消息队列/n");     getchar();      if(-1 == shmctl(msgid, IPC_RMID, NULL))     {         perror("shmctl failed");         exit(2);     }     return 0; } 

recvmsg.c  用来接收消息的

 // recvmsg.c  #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h> #include<string.h>  struct my_msg {     int mtype; // 消息类型     char buf[256]; }msg;  int main() {     key_t key = ftok("./", 88);      // 获取消息队列     int msgid = msgget(key, 0);     if(-1 == msgid)     {         perror("msgget failed!!!");         exit(1);     }      int res = msgrcv(msgid, &msg, sizeof(msg),             2, // 取消息类型为2的消息             0);     printf("类型:%d, 内容:%s/n", msg.mtype, msg.buf);      printf("消息接收完成,按回车销毁消息队列/n");     getchar();      if(-1 == shmctl(msgid, IPC_RMID, NULL))     {         perror("shmctl failed");         exit(2);     }     return 0; } 

5,运行结果

Linux进程间通信之消息队列

Linux进程间通信之消息队列

原文  http://www.cnblogs.com/xcywt/p/5172885.html
正文到此结束
Loading...