`

C语言进程间通信(三)——消息队列

 
阅读更多

消息队列是最具有数据操作性的数据传输方式,在消息队列中可随意根据特定的数据类型检索消息,随内核持续的

消息队列是一个消息的链表,每个消息队列都有个队列头,用结构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
分享到:
评论

相关推荐

    华清远见嵌入式linux应用程序开发技术详解下载(内部资料).rar

     8.1 Linux下进程间通信概述   8.2 管道通信   8.3 信号通信  8.4 共享内存   8.5 消息队列  8.6 实验内容   本章小结   思考与练习 第9章 多线程编程   9.1 Linux下线程概述   9.2 Linux...

    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系统调用...

    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系统调用...

    嵌入式Linux应用程序开发标准教程(第2版全)

    接着系统地讲解了嵌入式Linux的环境搭建,以及嵌入式Linux的I/O与文件系统的开发、进程控制开发、进程间通信开发、网络应用开发、基于中断的开发、设备驱动程序的开发以及嵌入式图形界面的开发等,并且还安排了丰富...

    linux 内核源代码分析

    第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6. 5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 第7章 基于socket的进程间通信 ...

    Linux内核情景分析(非扫描版)

    第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6. 5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 《LINUX内核源代码情景分析(下册)》图书...

    Linux内核情景分析

    第6章 传统的Unix进程间通信 6.1 概述 6.2 管道和系统调用pipe() 6.3 命名管道 6.4 信号 6. 5 系统调用ptrace()和进程跟踪 6.6 报文传递 6.7 共享内存 6.8 信号量 《LINUX内核源代码情景分析(下册)》图书...

    嵌入式Linux C编程入门(第2版) PPT

    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 守护...

    嵌入式Linux应用程序开发详解

    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 信号...

    UNIX高级编程 计算机科学丛书

    5. IPC——进程间通信(第十四、十五章)。 6. 实例—一个数据库的函数库(第十六章)、与Postscrip打印机的通信(第十七章)、调制解调器拨号程序(第十八章)以及使用伪终端(第十九章)。 如果对C语言较熟悉并...

    Linux程序设计 第4版.haozip01

    第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 ...

    Linux程序设计 第4版.haozip02

    第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驱动开发技术详解-part2

    要介绍Windows操作系统内核的基本概念,同时还介绍应用程序和驱动程序之间的通信方法。  2.1 Windows操作系统概述  2.1.1 Windows家族  2.1.2 Windows特性  2.1.3 用户模式和内核模式  2.1.4 操作系统与...

    Windows驱动开发技术详解的光盘-part1

    本章主要介绍Windows操作系统内核的基本概念,同时还介绍应用程序和驱动程序之间的通信方法。  2.1 Windows操作系统概述  2.1.1 Windows家族  2.1.2 Windows特性  2.1.3 用户模式和内核模式  2.1.4 操作...

Global site tag (gtag.js) - Google Analytics