消息队列是最具有数据操作性的数据传输方式,在消息队列中可随意根据特定的数据类型检索消息,随内核持续的
消息队列是一个消息的链表,每个消息队列都有个队列头,用结构struct msg_queue描述,队列头包含队列的大量消息,包括消息队列键值,用户ID,组ID,消息数目等。
struct msg_queue { struct ipc_perm q_perm; time_t q_stime; //最后一次msgsnd时间 time_t q_rtime; //最后一次msgrcv时间 time_t q_ctime; //最后一次变更时间 unsigned long q_cbytes; //当前消息队列中字节数目 unsigned long q_qnum; //队列中消息个数 unsigned long q_qbytes; //队列中最大字节数目 pid_t q_lspid; //最后msgsnd的进程ID pid_t q_lrpid; //最后receive进程ID struct list_head q_messages; struct list_head q_receivers; struct list_head q_senders; }
结构msqid_ds用来设置或返回消息队列的信息
struct msqid_ds { struct ipc_perm q_perm; struct msg *msg_first; //第一个消息 struct msg *msg_last; //最后一个消息 time_t msg_stime; //最后一次msgsnd时间 time_t msg_rtime; //最后一次msgrcv时间 time_t msg_ctime; //最后一次变更时间 pid_t msg_lspid; //最后msgsnd的进程ID pid_t msg_lrpid; //最后receive进程ID //... }
消息队列读端
//read_queue.c #include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h> #include<stdio.h> #include<sys/stat.h> #include<unistd.h> #include <errno.h> #define LEN 10 typedef struct { long int my_msg_type; char msg[LEN+1]; }msg_buf; int main() { int ret; int msg_id; msg_id = msgget((key_t)1000,0666|IPC_CREAT); if(msg_id == -1){ printf("msgget failed\n"); return -1; } printf("msg_id:%d\n",msg_id); msg_buf mb; ret = msgrcv(msg_id,(void *)&mb,sizeof(msg_buf),3,IPC_NOWAIT); if(ret == -1){ printf("msgrcv failed:%d\n",errno); return -1; } printf("recv %s\n",mb.msg); return 0; }
消息队列写端
//create_queue.c #include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h> #include<stdio.h> #include<string.h> #include<sys/stat.h> #include<unistd.h> #include<errno.h> #define LEN 10 typedef struct { long int my_msg_type; //64位机器必须设置为long char msg[LEN+1]; }msg_buf; int main() { int i; int ret; int msg_id; msg_id = msgget((key_t)1000,0666|IPC_CREAT); if(msg_id == -1){ printf("msgget failed\n"); return -1; } printf("msg_id=%d\n",msg_id); msg_buf mb; mb.my_msg_type = 3; strncpy(mb.msg,"msg1",LEN); ret = msgsnd(msg_id,(void *)&mb,sizeof(msg_buf),0); if(ret == -1){ printf("msgsnd failed\n"); return -1; } printf("message sent:%d\n",ret); return 0; }
注意针对64位机器,必须设置type为long类型,不然消息不会被接收端收到
编译运行结果如下
root:~/ciaos # ./write msg_id=327689 message sent:0 root:~/ciaos # ipcs -q ------ Message Queues -------- key msqid owner perms used-bytes messages 0x000003e8 327689 root 666 24 1 root:~/ciaos # ./read msg_id:327689 recv msg1 root:~/ciaos # ipcs -q ------ Message Queues -------- key msqid owner perms used-bytes messages 0x000003e8 327689 root 666 0 0
相关推荐
8.1 Linux下进程间通信概述 8.2 管道通信 8.3 信号通信 8.4 共享内存 8.5 消息队列 8.6 实验内容 本章小结 思考与练习 第9章 多线程编程 9.1 Linux下线程概述 9.2 Linux...
第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6.5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程间通信 7.1系统调用...
第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6.5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章基于socket的进程间通信 7.1系统调用...
接着系统地讲解了嵌入式Linux的环境搭建,以及嵌入式Linux的I/O与文件系统的开发、进程控制开发、进程间通信开发、网络应用开发、基于中断的开发、设备驱动程序的开发以及嵌入式图形界面的开发等,并且还安排了丰富...
第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6. 5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章 基于socket的进程间通信 ...
第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6. 5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 《LINUX内核源代码情景分析(下册)》图书...
第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6. 5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 《LINUX内核源代码情景分析(下册)》图书...
10.3 arm linux进程间通信api 301 10.3.1 管道通信 301 10.3.2 信号通信 303 10.3.3 共享内存 308 10.3.4 消息队列 309 10.4 arm linux线程相关api 312 10.5 linux守护进程 317 10.5.1 守护...
8.1 Linux下进程间通信概述 240 8.2 管道通信 241 8.2.1 管道概述 241 8.2.2 管道创建与关闭 242 8.2.3 管道读写 244 8.2.4 标准流管道 246 8.2.5 FIFO 249 8.3 信号通信 253 8.3.1 信号...
5. IPC——进程间通信(第十四、十五章)。 6. 实例—一个数据库的函数库(第十六章)、与Postscrip打印机的通信(第十七章)、调制解调器拨号程序(第十八章)以及使用伪终端(第十九章)。 如果对C语言较熟悉并...
第13章 进程间通信:管道 443 13.1 什么是管道 443 13.2 进程管道 444 13.3 将输出送往popen 445 13.3.1 传递更多的数据 446 13.3.2 如何实现popen 447 13.4 pipe调用 449 13.5 父进程和子进程 451 13.5.1 ...
第13章 进程间通信:管道 443 13.1 什么是管道 443 13.2 进程管道 444 13.3 将输出送往popen 445 13.3.1 传递更多的数据 446 13.3.2 如何实现popen 447 13.4 pipe调用 449 13.5 父进程和子进程 451 13.5.1 ...
要介绍Windows操作系统内核的基本概念,同时还介绍应用程序和驱动程序之间的通信方法。 2.1 Windows操作系统概述 2.1.1 Windows家族 2.1.2 Windows特性 2.1.3 用户模式和内核模式 2.1.4 操作系统与...
本章主要介绍Windows操作系统内核的基本概念,同时还介绍应用程序和驱动程序之间的通信方法。 2.1 Windows操作系统概述 2.1.1 Windows家族 2.1.2 Windows特性 2.1.3 用户模式和内核模式 2.1.4 操作...