一、System V 消息队列简介 消息队列:消息队列的本质是由Linux内核创建用于存放消息的链表,并且其功能是用来存放消息的,所以又称之为消息队列。...在Linux的不同进程中,包括有血缘的进程和无血缘的进程,都可以通过Linux消息队列API所得到的消息队列唯一标识符对消息队列进行操作。...二、分析消息队列的数据结构 Linux为了维护消息队列,为消息队列创建了数据结构,接下来我们来分析一下消息队列的结构以及消息队列节点的结构。...内核所设计消息队列的大致模样,这对于我们理解消息队列Linux API有着至关重要的作用。...此时需要自己创建msqid_ds结构体并初始化然后传入。 (3)IPC_STAT,此时buff作为传出参数可以获取消息队列消息头中msg_perm结构体的在内核中的内容。
一,关于Linux中的IPC IPC的意思是“ 进程间通信机制”,Linux内核有三种常用IPC对象可以拿来做进程间通信--消息队列,共享内存,信号量。...这三种IPC对象在Linux内核中都以链表的形式存储,它们都有特定的ID来标识(消息队列标识符msqid、共享内存标识符shmid,信号量标识符semid)。...与消息队列关联的结构体--msqid_ds/mq_attr msqid_ds常用于SYSTEM_V版的函数 struct msqid_ds{ struct ipc_perm msg_perm;...msgctl()常用的cmd: IPC_STAT: 获取该消息队列的信息,获取到的信息会储存在结构体msqid_ds类型的buf中 IPC_SET: 设置消息队列的属性,要设置的属性需先在结构体msqid_ds...参考教程: 《UNIX环境高级编程第3版》 https://programs.team/linux-message-queue-programming.html https://www.tutorialspoint.com
/UNP/system_v$ cat /proc/sys/kernel/msgmax 8192 simba@ubuntu:~/Documents/code/linux_programming/UNP...三、消息队列结构 struct msqid_ds { struct ipc_perm msg_perm; /* Ownership and permissions */ time_t ...输出如下: simba@ubuntu:~/Documents/code/linux_programming/UNP/system_v$ ....(2)int msgctl(int msqid, int cmd, struct msqid_ds *buf); 功能:消息队列的控制函数 参数 msqid: 由msgget函数返回的消息队列标识码... ERR_EXIT("msgget"); printf("msgget success\n"); printf("msgid=%d\n", msgid); struct msqid_ds
struct list_head q_messages; struct list_head q_receives; struct list_head q_senders; }; 结构体msqid_ds...用来设置或返回消息队列的信息,定义如下: // 摘自所用ubuntu18.04电脑中的/usr/include/i386-linux-gnu/bits/msq.h struct msqid_ds {...include #include #include int msgctl(int msqid, int cmd, struct msqid_ds...printf("unlink msg queue error\n"); } return 0; } void msg_stat(int msgid, struct msqid_ds...参考: 《精通Linux C编程》- 程国钢 《Linux C编程完全解密》- 闫敬 吴淑坤
2.消息队列的三个数据结构 linux内核采用的结构msqid_ds管理消息队列 struct msqid_ds { struct ipc_perm msg_perm; //消息队列访问权限...msg_stime; //最后发送消息的时间 time_t msg_rtime; //最后接收消息的时间 time_t msg_ctime; //最近修改消息队列的时间 }; linux
消息队列 消息队列是Linux IPC中很常用的一种通信方式,它通常用来在不同进程间发送特定格式的消息数据。...消息队列中的每条消息通常具有以下属性: Ø 一个表示优先级的整数; Ø 消息的数据部分的长度; Ø 消息数据本身; 下面我们分别阐述POSIX消息队列和System V消息队列,这2种消息队列目前Linux...在Linux 2.6中该类型的定义为整型: #include typedef int mqd_t; // 关闭消息队列 mqd_t mq_close(mqd_t mqdes...下面是在Linux 2.6下shell对启动进程的POSIX消息队列大小的限制: [root@rocket ipc]# ulimit -a|grep message POSIX message queues...ds; iret = msgctl(msgid, IPC_STAT, (struct msqid_ds *)&ds); if(iret == -1) { printf
unsigned short __seq; /* Sequence number */ }; 下面是消息队列的数据结构: struct msqid_ds...ipc.h> #include int msgget(key_t key, int msgfl_g); int msgctl(int msqid, int cmd, struct msqid_ds...printf("msgid = %d\n", msgid); return 0; } 4.2 msgctl int msgctl(int msqid, int cmd, struct msqid_ds...IPC_SET:在进程有足够权限的条件下,把消息队列的当前关联值设置为msqid_ds数据结构中给出的值 IPC_RMID:删除消息队列。...ERR_EXIT("msgctl"); printf("remove msg success\n"); } void settest(int msgid) { struct msqid_ds
data */ }; 设置消息队列属性 #include --------------------- int msgctl(int msqid, int cmd, struct msqid_ds...*buf); 参数解释msgid消息队列idcmd队列执行的命令bug执行msqid_ds的指针 进一步对cmd名字做详细解释 cmd解释IPC_STAT取得此队列的msqid_ds结构,存在在buf
. */ extern int msgctl (int __msqid, int __cmd, struct msqid_ds *__buf) __THROW; __msqid 消息队列的ID __cmd.../* Get `ipc_perm' options. */ //把msgid_ds结构中的数据设置为消息队列的当前关联值,即用消息队列的当前关联值覆盖msgid_ds的值 __buf msqid_ds...对删除消息队列的处理不是很完善,因为每个消息队列没有维护引用计数(打开文件有这种计数器),所以在队列被删除以后,仍在使用这一队列的进程在下次对队列进行操作时会出错返回 函数成功时返回0,失败时返回-1 ---- msqid_ds...在 bits/msq.h 中有关于 msqid_ds 的定义 /* Structure of record for one message inside the kernel....The type `struct msg' is opaque. */ struct msqid_ds { struct ipc_perm msg_perm; /* structure describing
0666 | IPC_CREAT); msgrcv(msgid, (void *)&data, BUFSIZ, msgtype, 0) 在这里插入图片描述 进程通过key可以获取或者创建(系统维护)一个msqid_ds...后续进程通过id对msqid_ds进行存取。msqid_ds是表示一个消息队列的管理者。各个进程使用一个msqid_ds进行通信。操作系统会有权限控制,大小控制等。
msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg); int msgctl(int msqid, int cmd, struct msqid_ds...返回值: 成功:读取消息的长度 失败:-1 消息队列的控制 所需头文件: #include int msgctl(int msqid, int cmd, struct msqid_ds...buf:msqid_ds 数据类型的地址,用来存放或更改消息队列的属性。
include #include #include int msgctl(int msqid, int cmd, struct msqid_ds...cmd: IPC_STAT: 将msg相关的内核信息存储到buf指向的msqid_ds 结构体中。调用者需拥有阅读权限才可读取。...IPC_RMID:删除msqid标识的消息队列 buf: struct msqid_ds { struct ipc_perm msg_perm; /* Ownership and permissions
前面文章介绍了Linux下进程的创建,管理,陆续介绍了进程间通信的方式:管道、内存映射、共享内存等。这篇文章继续介绍Linux的进程间通信方式消息队列。 1....struct msgbuf * msgp, size_t msgsz, long msgtyp, int msgflg); int msgctl(int msqid, int cmd, struct msqid_ds...include #include #include int msgctl(int msqid, int cmd, struct msqid_ds
; 28 } 29 int msgQueue::getQueueLen() 30 { 31 struct msqid_ds buf; 32 int ret = msgctl(m_queueID
参考补充: Linux API速查手册-msgget msgget(2) — Linux manual page ---- 消息的发送 msgsnd 作用:发送一个消息,即把一个消息放到某一个消息队列中...参考补充: Linux manual page ---- 消息的接收 msgrcv 函数原型:ssize_t msgrcv (int msqid, void *msgp, size_t msgsz,...---- 消息的控制 msgctl 函数原型:int msgctl(int msqid, int cmd, struct msqid_ds *buf); 功能:用来对消息队列的基本属性进行控制、修改...补充: msgctl(2) — Linux manual page ---- 示例 示例1: 程序1:发送消息到消息队列,程序2进行接收。
消息队列属性控制 int msgctl(int msqid, int cmd, struct msqid_ds *buf) 功能: 对消息队列进行各种控制操作,操作的动作由cmd控制。...IPC_RMID:删除由msqid指示的消息队列,将它从系统中删除并破坏相关数据结构. buf:消息队列缓冲区 struct msqid_ds { struct ipc_perm
关于消息队列更详细的介绍可以看看这两篇文章: 《什么是消息队列》 《消息队列详解》 1.2、消息队列的数据结构 同属于 System V 标准,消息队列也有属于自己的数据结构 注:msg 表示 消息队列 struct msqid_ds...int msgflg 位图,可以设置消息队列的创建方式及创建权限 与 共享内存 的 shmget 可以说是十分相似了,关于 ftok 函数计算 key 值,这里就不再阐述,可以在这篇文章中学习 《Linux...include #include #include int msgctl(int msqid, int cmd, struct msqid_ds...函数 组成部分 含义 返回值 int 成功返回 0,失败返回 -1 参数1 int msqid 待控制的消息队列 id 参数2 int cmd 控制消息队列的具体动作,同样是位图 参数3 struct msqid_ds...假设想访问具体 ipc 中的资源,可以通过 ipc_id_arr[n] 强转为对应类型指针,再通过 -> 访问其中的其他资源 以上方法就是 多态,通过父类指针,访问成员 ---- 总结 以上就是本次关于 Linux
前言 UNIX/Linux 是多任务的操作系统,通过多个进程分别处理不同事务来实现,如果多个进程要进行协同工作或者争用同一个资源时,互相之间的通讯就很有必要了 进程间通信,Inter process communication...,简称 IPC,在 UNIX/Linux 下主要有以下几种方式: 无名管道 ( pipe ) 有名管道 ( fifo ) 信号 ( signal ) 信号量 ( semaphore ) 消息队列 ( message...都是随内核持续的 消息队列的链表结构类型于下: /* Obsolete, used only for backwards compatibility and libc5 compiles */ struct msqid_ds...对于每个消息队列,Linux 内核为标识符分配44B,为消息队列数据结构分配 96B。为了获得更多的消息队列资源,可以动态增加 msgmni 取值。
命令使用以便将数据从一条管道线传送到另一条,为此无需创建临时文件 (2)用于 client-server 进程应用程序中,以在 client 和 server 间传递数据 3 消息队列 每个队列的struct msqid_ds...结构如下: struct msqid_ds { struct ipc_perm msg_perm; /* see Section 15.6.2 */ msgqnum_t...msgctl msgctl 函数可以执行多种操作,与 ioctl、semctl、shmctl 非常类似,都被称为“垃圾桶函数 int msgctl(int msqid, int cmd, struct msqid_ds
:成功时为读入缓冲区中数据的字节数,出错是为-1 6.5 msgctl函数 #include int msgctl(int msqid, int cmd, struct msqid_ds
领取专属 10元无门槛券
手把手带您无忧上云