因为近期的工作上必须使用消息队列,顺便花时间梳理了一下。
C语言消息队列,有三种,一种是System V ipc,第二种的是posix ipc,第三种是自身用编码完成的消息队列。
System V ipc 和Posix ipc 也叫进程间通信。(IPC的全名是Inter-process Comminication,便是进程间通信)。
进程间通信分成三个內容,分别是:消息队列、信号量和共享内存。
System V IPC也可分为下列三种种类:
System V 消息队列
System V 信号量
System V 共享内存区
System V IPC 三种类型
文中将关键详细介绍System V 消息队列
在System V IPC中,System v ipc中有一个至关重要的类别是key_t,在msget、semget、shmget函数实际操作里都必须运用这一种类是主要参数。
key_t的值由函数ftok来转化成,函数ftok把一个[已具有的路径名,pathname]和一个[整数金额标志符,id]变换称一个key_t值, 称之为IPC键。
key_t ftok(const char *pathname, int proj_id);
System V 消息队列
消息队列函数由msgget、msgctl、msgsnd、msgrcv四个函数构成。
1.msgget函数原型
msgget函数原型
假如用msgget建立了一个新的消息队列目标时,则msqid_ds构造成员变量的值设定如下所示:
msg_qnum、msg_lspid、msg_lrpid、 msg_stime、msg_rtime设定为0。
msg_ctime设置为现在时间。
msg_qbytes设置成系统软件的限定值。
msgflg的读写能力管理权限载入msg_perm.mode中。
msg_perm构造的uid和cuid组员被设置成现阶段过程的合理客户ID,gid和cuid组员被设置成现阶段过程的合理组ID。
2.msgctl函数原型
msgctl函数原型
3.msgsnd函数原型
msgsnd函数原型
msgsnd()为阻塞函数,当消息队列容积满或信息数量满会阻塞。消息队列已被删掉,则回到EIDRM不正确;被信号中断回到E_INTR不正确。
假如设定IPC_NOWAIT消息队列满或数量满的时候会回到-1,而且置EAGAIN不正确。
msgsnd()消除阻塞的前提有下列三个标准:
① 不符合消息队列满或数量满2个标准,即消息队列中有容下该信息的室内空间。
② msqid意味着的消息队列被删掉。
③ 启用msgsnd函数的过程被信号中断。
4.msgrcv函数原型
msgrcv函数原型
msgrcv()消除阻塞的前提有下列三个:
① 消息队列中拥有符合条件的信息。
② msqid意味着的消息队列被删掉。
③ 启用msgrcv()的过程被信号中断。
消息队列应用程序流程案例
msgrcv.c
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdio.h>
struct msgbuf
{
long type;
int groupid;
int appid;
char buf[1024];
};
int main()
{
int msgid;
msgid=msgget(0x1000,IPC_CREAT | 0777);
struct msgbuf mb;
msgrcv(msgid,&mb,sizeof(struct msgbuf)-sizeof(long),1,0);
printf(\"type: %dtgroupid: %dtappid: %dn\", mb.type,mb.groupid, mb.appid);
puts(mb.buf);
}
msgsnd.c
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdio.h>
struct msgbuf
{
long type;//种类
int groupid;
int appid;
char buf[1024];
};
int main()
{
int msgid;
msgid=msgget(0x1000,IPC_CREAT | 0777);
struct msgbuf mb={1,1,1,\"hello world\"};
int ret;
ret=msgsnd(msgid,&mb,sizeof(struct msgbuf)-sizeof(long),0);
//这儿的长短不包括种类的尺寸
}
检测
在运作./msgsnd程序流程后,应用ipcs命令,可查询到消息队列的情况信息内容。如下图,表明有一条信息。
分阶段实行和查询消息队列信息内容
在控制台实行./msgsnd &。
推送信息
ipcs查询Message Queues信息内容。
查看ipcs
实行./msgrcv,接受消息队列信息内容。
接受信息
ipcs查询Message Queues信息内容。信息已被接受。
查看ipcs
最终是对POSIX和System V的一个发源详细介绍
POSIX
POSIX(Portable Operating System Interface for Computing Systems)是由IEEE 和ISO/IEC 开发设计的一簇规范。该标准是根据目前的UNIX 实践活动和工作经验,叙述了电脑操作系统的启用服务项目插口,用以确保定编的程序可以在源码一级上在多种多样电脑操作系统上移殖运作。它是在1980 年初期一个UNIX 用户组(usr/group)的前期工作中的基本上获得的。该UNIX 用户组原先尝试将AT&T 的系统软件V 和Berkeley CSRG的BSD 系统的启用插口中间的差别再次调合集成化,进而于1984 年出现了/usr/group 规范。1985 年,IEEE电脑操作系统技术性联合会规范工作组联合会(TCOS-SS)逐渐在ANSI 的大力支持下责令IEEE 规范联合会制订相关程序流程源码可扩展性电脑操作系统服务项目插口宣布规范。到了1986 年4 月,IEEE 就制订出了使用规范。第一个宣布规范是在1988 年9 月份准许的(IEEE 1003.1-1988),也既之后常常提起的POSIX.1 规范。
System V
System V, 以前也被称作 AT&T System V,是Unix电脑操作系统诸多游戏版本中的一支。它初由 AT&T 开发设计,在1983年第一次公布。一共发售了4个 System V 的关键版本号:版本1、2、3 和 4。System V Release 4,或是称之为SVR4,是获得成功的版本号,变成一些UNIX一同特点的根源,例如 ”SysV 复位脚本制作“ (/etc/init.d),用于自动控制系统运行和关掉,System V Interface Definition (SVID) 是一个System V 怎样工作的标准定义。
AT&T 售卖运作System V的专用硬件配置,但很多(也许是大部分)顾客在其上运作一个转卖的版本号,这一版本号根据 AT&T 的完成表明。时兴的SysV 衍化版本号包含 Dell SVR4 和 Bull SVR4。现如今普遍采用的 System V 版本号是 SCO OpenServer,根据 System V Release 3,及其SUN Solaris 和 SCO UnixWare,都根据 System V Release 4。
System V 是 AT&T 的第一个商业服务UNIX版本号(UNIX System III)的加强。传统式上,System V 被看成是二种UNIX”口味”之一(另一个是 BSD)。殊不知,伴随着一些并不根据这二者编码的UNIX完成的发生,例如 Linux 和 QNX, 这一梳理不会再精确,但不论怎样,像POSIX那样的标准化勤奋一直在尝试降低各种各样完成中间的不一样。
就先去这儿,后边再讲一下Posix线程池和自身用编码完成的线程池。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。