System V消息队列(1)

原文链接:http://www.cnblogs.com/sklww/p/3494765.html

1,内核中的某个消息队列可表示如下:

  

其中msqid_ds结构体为:

struct msqid_ds {
  struct       ipc_perm msg_perm;    /* see Section 15.6.2 */
  msgqnum_t    msg_qnum;             /* # of messages on queue */
  msglen_t     msg_qbytes;           /* max # of bytes on queue */
  pid_t        msg_lspid;            /* pid of last msgsnd() */
  pid_t        msg_lrpid;            /* pid of last msgrcv() */
  time_t       msg_stime;            /* last-msgsnd() time */
  time_t       msg_rtime;            /* last-msgrcv() time */
  time_t      msg_ctime;             /* last-change time */
};

2,常用函数为:

  

#include <sys/msg.h>
int msgget(key_t key,int oflag);//创建一个新的消息队列或者访问一个已存在的信息队列 
int msgsnd(int msqid,const void *ptr,size_t length,int flag);//发消息
其中ptr是一个结构体指针,模板如下:
struct msgbuf{
    long msgbuf;//必需大于 0
    char mtext[1];
};
ssize_t msgrcv(int msqid,void *ptr,size_t lenght,long type,int flag);//收消息
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
//cmd=IPC_RMID,删除msqid指定的消息队列
//cmd=IPC_SET,设置指定消息队列的msqid_ds结构体中的msg_perm.uid,msg_perm.gid,msg_perm.mode,
//             msg_qbytes的值
//cmd=IPC_STAT,返回当前msqid_ds结构

例子:

#include <stdio.h>
#include <stdlib.h>
#include <sys/msg.h>
#define MSG_R 0400
#define MSG_W 0200
#define    MODE    (MSG_R|MSG_W|MSG_R>>3|MSG_R>>6|IPC_CREAT)
 struct my_msgbuff{
    long mtype;
    char mtext[1];
    char *buff;
};
int main(void) {
    int msgid;
    char msg_test[]="I'm a test";
    struct my_msgbuff send_msg,rec_msg;
    struct msqid_ds info;
    msgid=msgget(IPC_PRIVATE,MODE);
    msgctl(msgid,IPC_STAT,&info);
    printf("发送信息前:消息的个数 =%lu\n",info.msg_qnum);
    send_msg.mtype=100;
    send_msg.buff=msg_test;
    msgsnd(msgid,(void *)&send_msg,sizeof(send_msg)-sizeof(long),IPC_NOWAIT);
    msgctl(msgid,IPC_STAT,&info);
    printf("发送信息后:消息的个数 =%lu\n",info.msg_qnum);
    msgrcv(msgid,(void *)&rec_msg,sizeof(rec_msg)+1,100,IPC_NOWAIT);
    if(rec_msg.buff!=NULL){
        printf("收到的信息为:%s\n",rec_msg.buff);
    }
    else{
        printf("接收信息失败\n");
    }
    msgctl(msgid,IPC_STAT,&info);
    printf("接收信息后:消息的个数 =%lu\n",info.msg_qnum);
    msgctl(msgid,IPC_RMID,NULL);
    return EXIT_SUCCESS;
}

4,运行结果:

发送信息前:消息的个数 =0
发送信息后:消息的个数 =1
收到的信息为:I'm a test
接收信息后:消息的个数 =0

 

 

转载于:https://www.cnblogs.com/sklww/p/3494765.html

展开阅读全文
博主设置当前文章不允许评论。

system V 消息队列

07-25

<p>n <span style="font-size:18px;">Linux系统提供了各种系统调用API用于进程之间的通信:</span>n</p>n<p>n </p><ul><li>n <span style="font-size:16px;">    无名管道PIPE</span>n </li>n <li>n <span style="font-size:16px;">    命名管道FIFO</span>n </li>n <li>n <span style="font-size:16px;">    消息队列</span>n </li>n <li>n <span style="font-size:16px;">    共享内存</span>n </li>n <li>n <span style="font-size:16px;">    信号量</span>n </li>n <li>n <span style="font-size:16px;">    文件锁</span>n </li>n <li>n <span style="font-size:16px;">    信号signal....</span>n </li>n </ul><p>n <span style="font-size:18px;">其中还包括system V和POSIX 两种接口标准,除此之外,Linux系统自身还扩展了自己的一套API接口用于进程间通信,比如signalfd、timerfd、eventfd等。</span>n</p>n<p>n <br /></p>n<p>n <span style="font-size:18px;">本视频教程为《Linux系统编程》第05期,本期课程将会带领大家学习Linux下将近15种进程间通信IPC工具的使用,了解它们的通信机制、编程实例、使用场景、内核中的实现以及各自的优缺点。</span>n</p>n<p>n <br /></p>n<p>n <span style="font-size:14px;background-color:#CCCCCC;">本课程会提供PDF版本的PPT课件和代码,学员购买课程后可到课程主页自行下载</span>n</p>n<p>n <span style="font-size:18px;"><br /></span>n</p>n<p>n <span style="font-size:18px;"><br /></span>n</p>n<p>n <span style="font-size:18px;">n </span></p><p>n <span style="background-color:#FF9900;">嵌入式自学路线指导图</span>:n </p>n <p>n ------------------------------------------------------------------------------------------------------n </p>n <p>n                    《<strong>嵌入式工程师自我修养</strong>》嵌入式自学系列教程n </p>n <p>n                                           作者:王利涛n </p>n <p>n ------------------------------------------------------------------------------------------------------n </p>n <p>n 一线嵌入式工程师精心打造,嵌入式学习路线六步走: n </p>n <p>n <br /></p>n <p>n <span style="background-color:#60D978;">第 1 步:Linux三剑客</span>n </p>n <ul><li>n <p>n <span style="font-size:16px;">零基础玩转Linux+Ubuntu</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">Git零基础实战:Linux开发技能标配</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">vim从入门到精通基础篇:零基础学习vim基本命令</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">vim从入门到精通定制篇:使用插件打造嵌入式开发IDE</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">makefile工程实践基础篇:从零开始一步一步写项目的Makefile</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">makefile工程实践第2季:使用Autotools自动生成Makefile</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">软件调试基础理论</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">printf打印技巧</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">Linux内核日志与打印</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">使用QEMU搭建u-boot+Linux+NFS嵌入式开发环境</span>n </p>n </li>n </ul><p>n <span style="background-color:#60D978;">第 2 步:C语言嵌入式Linux高级编程</span>n </p>n <ul><li>n <p>n <span style="font-size:16px;">第1期:C语言进阶学习路线指南</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">第2期:计算机架构与ARM汇编程序设计</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">第3期:程序的编译、链接和运行原理</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">第4期:堆栈内存管理</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">第6期:数据存储与指针</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">第7期:嵌入式数据结构与Linux内核的OOP思想</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">第8期:C语言的模块化编程</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">第9期:CPU和操作系统入门</span>n </p>n </li>n </ul><p>n       搞内核驱动开发、光会C语言是不行的!n </p>n <p>n       你还需要学习的有很多,包括:计算机体系架构、ARM汇编、程序的编译链接运行原理、CPU和操作系统原理、堆栈内存管理、指针、linux内核中的面向对象思想、嵌入式系统架构、C语言的模块化编程.....n </p>n <p>n <br /></p>n <p>n <span style="background-color:#60D978;">第 3 步:Linux系统编程</span>n </p>n <ul><li>n <p>n <span style="font-size:16px;">第00期:Linux系统编程入门</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">第01期:揭开文件系统的神秘面纱</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">第02期:文件I/O编程实战</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">第03期:I/O缓存与内存映射</span>n </p>n </li>n <li>n <p>n <span style="font-size:16px;">第04期:打通进程与终端的任督二脉</span>n </p>n </li>n <li>n <p>n <span style="background-color:#E53333;font-size:16px;">第05期:进程间通信-------------------we are here!‍</span>n </p>n </li>n </ul><p>n     n </p>n <p>n <span style="background-color:#60D978;">第 4 步:Linux内核编程‍</span>n </p>n <p>n     练乾坤大挪移,会不会九阳神功,是一道坎。搞驱动内核开发,懂不懂内核也是一道坎。n </p>n <p>n <span style="background-color:#60D978;">第 5 步:嵌入式驱动开发</span>n </p>n <p>n     芯片原理、datasheet、硬件电路、调试手段、总线协议、内核机制、框架流程....n </p>n <p>n <span style="background-color:#60D978;">第 6 步:项目实战</span>n </p>n <p>n     嵌入式、嵌入式人工智能、物联网、智能家居...n </p>n<br />n

没有更多推荐了,返回首页