当前位置: 首页 > news >正文

广州旅游团购网站建设收录是什么意思

广州旅游团购网站建设,收录是什么意思,公司网络营销策划书,深圳集团网站开发Linux C语言 40-进程间通信IPC之消息队列 本节关键字#xff1a;C语言 System V IPC 进程间通信 消息队列 相关库函数#xff1a;ftok、msgget、msgsnd、msgrcv、msgctl 什么是消息队列#xff1f; 消息队列是System V中的一种进程间通信机制#xff08;如管道、信号量、…Linux C语言 40-进程间通信IPC之消息队列 本节关键字C语言 System V IPC 进程间通信 消息队列 相关库函数ftok、msgget、msgsnd、msgrcv、msgctl 什么是消息队列 消息队列是System V中的一种进程间通信机制如管道、信号量、共享内存等在Linux系统中消息队列本质上是内核维护的一块内存。 消息队列的特点 消息队列优化了管道的FIFOFirst InFirst Out、亲属进程、半双工以及单对单通信的缺点消息队列中的消息是有类型的可以更快的取出想要的数据消息队列中的消息是有格式的发送消息时需要按照一定的格式组数据报消息队列可以实现消息的随机查询没有先进先出的限制可以按照消息的类型读取消息队列允许一个或多个进程写入或读取消息消息队列中消息被读出后会被删除消息队列拥有唯一的标识符消息队列在创建后只有人工删除或内核重启时才会被删除否则被创建的消息队列会一直存在与操作系统中消息队列中每条消息的长度最多为8K字节消息队列的容量最多为16K字节消息队列在操作系统中共存的数量最多为1609个操作系统中消息的共存数量最多为16384个 Trip单个进程中消息队列的限制可以使用命令 ulimit -a 进行查看。 消息队列相关库函数 创建消息队列 #include sys/types.h #include sys/ipc.h #include sys/msg.hkey_t ftok(const char *pathname, int proj_id); /** brief ftok()函数使用给定文件的路径名命名标识必须引用现有的可访问文件和proj_id的最低有效位8必须为非零来生成key_t类型的System V IPC密钥该密钥适用于msgget(2)、semget(2)或shmget(2)。 当使用相同的proj_id值时命名相同文件的所有路径名的结果值都是相同的。当同时存在的文件或项目ID不同时返回的值应该不同。 param pathname 指定文件的路径名必须引用现有的可访问文件 param proj_id 用来生成System V IPC密钥低八位必须不为零。当使用相同的proj_id值时命名相同文件的所有路径名的结果值都相同。当文件或proj_id不同时返回的值应该不同。 return 成功返回生成的key_t值。失败返回-1并设置错误码errno */int msgget(key_t key, int msgflg); /** brief 获取消息队列标识符。msgget()系统调用返回与参数key值相关联的消息队列标识符。 param key 消息队列的System V IPC密钥。以下两种情况会创建新的消息队列当key值为IPC_PRIVATE时创建消息队列当key不是IPC_PRIVATE时不存在密钥与给定key值相同的消息队列并且在msgflg中指定了IPC_CREAT则会创建新的消息队列。 param msgflg 消息队列的权限值与mode_t一样没有可执行权限相关宏如下IPC_CREATE 创建消息队列IPC_EXCL 检测消息队列是否存在 return 成功返回消息队列的标识符失败返回-1并设置错误码errno错误码errno类型 EACCES 存在密钥为key的消息队列但调用进程没有访问该队列的权限并且不具有CAP_IPC_OWNER功能。 EEXIST 存在同时指定IPC_CREAT和IPC_EXCL的密钥和消息flg的消息队列。 ENOENT 不存在密钥为key的消息队列并且msgflg未指定IPC_CREAT。 ENOMEM 必须创建一个消息队列但系统没有足够的内存用于新的数据结构。 ENOSPC 必须创建消息队列但将超过消息队列最大数量MSGMNI的系统限制。TripIPC_PRIVATE不是标志字段而是key_t类型。如果这个特殊值用于key则系统调用将忽略除msgflg的最低有效9位之外的所有内容并创建一个新的消息队列。 */查看消息队列 消息队列的查看可以在命令行完成在消息队列创建成功后可以使用命令 ipcs 进行查看ipcs命令的使用参数如下 -m 查看系统共享内存信息 -q 查看系统消息队列信息 -s 查看系统信号量信息 -a 显示系统内所有的IPC信息 如果要手动删除指定的IPC可以使用 ipcrm [-msq] id 命令完成ipcrm 命令的使用参数如下 -m 移除指定的共享内存例ipcrm -m shmid -s 移除指定的信号量例ipcrm -m semid -q 移除指定的消息队列例ipcrm -m msgid 消息队列的消息格式 // Trip消息类型必须是长整型且必须是结构体中的第一个成员消息正文可以有多个任意类型的成员。typedef struct _msg {long mtype; // 消息类型必须大于0char mtext[100]; // 消息正文int mage; // 消息正文... // 消息正文可以有多个任意类型的成员 } MSG;向消息队列发送消息 Trip: msgsnd()被终端后永远不会自动重新启动。 #include sys/types.h #include sys/ipc.h #include sys/msg.h int msgsnd(int msgid, const void *msgp, size_t msgsz, int msgflg); /** brief msgsnd()系统调用向消息队列发送消息调用进程必须对消息队列具有写权限才能发送消息。msgsnd()系统调用将msgp指向的消息的副本附加到由msgid指定标识符的消息队列中。如果队列中有足够的可用空间则msgsnd()会立即成功。队列容量由消息队列的相关数据结构中的msg_bytes字段定义。在创建队列期间此字段初始化为MSGMNB字节但可以使用msgctl(2)修改此限制。如果队列中的可用空间不足则msgsnd()的默认行为是阻塞直到空间变为可用。如果在msgflg中指定了IPC_NOWAIT则调用会失败并返回错误EAGAIN。 param msgid 消息队列的标识符表示要向哪个消息队列发送消息 param msgp 指向调用方定义的结构结构格式如上述消息队列的消息格式一样 param msgsz 是一个非负整数指定msgp结构中mtext字段的大小结构中mtext字段是一个数组或其它结构允许长度为0的消息。 param msgfg 控制属性0阻塞发送直到消息队列由足够的空间去发送msgp指向的消息IPC_NOWAIT若消息没有立即发送则调用该函数的进程会立即返回 return 成功返回0失败返回-1并设置错误码errnoTrip阻塞的msgsnd()调用也可能失败原因如下 消息队列被删除这种情况下msgsnd()系统调用失败errno被设置为EIDRM 捕获一个信号这种情况下msgsnd()系统调用失败errno被设置为EINTR且不管是否设置了SA_RESTART标志msgsnd()被中断后都不会自动重新启动错误码errno类型 EACCES 调用进程没有对消息队列的写入权限也没有CAP_IPC_OWNER功能。 EAGAIN 由于队列的msg_qbytes限制无法发送消息并且在msgflg中指定了IPC_NOWAIT。 EFAULT 无法访问msgp指向的地址。 EIDRM 消息队列已删除。 EINTR 在消息队列已满的情况下休眠进程捕获到一个信号。 EINVAL 无效的msqid值、非正的mtype值或无效的msgsz值小于0或大于系统值MSGMAX。 ENOMEM 系统内存不足无法复制msgp指向的消息。 */从消息队列读取消息 以下消息队列资源限制会影响msgsnd调用 MSGMAX 消息文本的最大大小8192字节在Linux上可以通过/proc/sys/kernel/MSGMAX读取和修改此限制 MSGMNB 消息队列的默认最大字节大小16384字节在Linux上可以通过/proc/sys/kernel/MSGMNB读取和修改此限制。超级用户可以通过msgctl(2)系统调用将消息队列的大小增加到MSGMNB之外。 该实现对消息头的系统范围最大数量MSGTQL和消息池的系统范围以字节为单位的最大大小MSGPOOL没有内在限制。 #include sys/types.h #include sys/ipc.h #include sys/msg.h ssize_t msgrcv(int msgid, void *msgp, size_t msgsz, long msgtyp, int msgflg); /** brief msgrcv()系统调用从消息队列读取消息调用进程具有读权限才能接收消息 param msgid 消息队列的标识符表示要从哪个消息队列中获取消息 param msgp 指向存放消息结构体的地址 param msgsz 消息正文的字节数 param msgtyp 必须是一个正整数由接收进程用于消息选择。0读取消息队列中的第一个消息0读取消息队列中消息类型为msgtyp的消息0读取消息队列中消息类型值小于或等于msgtyp绝对值的消息如果有多个则读取类型值最小的消息。若消息队列中有多种类型的消息msgrcv获取消息的时候按消息类型获取不是先进先出的。 在获取某类型消息的时候若队列中有多条此类型的消息则获取最先添加的消息即先进先出原则。 param msgfg 控制属性。0 阻塞读取直到成功读取到消息MSG_NOERROR 若返回的消息字节数比msgsz多则会被截断且不通知消息发送进程IPC_NOWAIT 若没有读取到消息立即返回MSG_EXCEPT 与大于0的msgtyp一起使用读取队列中消息类型与msgtyp不同的第一条消息。 return 成功返回0失败返回-1并设置错误码errnoTrip执行成功后msg_lrpid设置为调用进程的进程IDmsg_qnum递减1msg_rtime设置为当前时间。错误码errno类型 E2BIG 消息文本长度大于msgsz并且未在msgflg中指定MSG_NOERROR。 EACCES 调用进程没有对消息队列的读取权限也没有CAP_IPC_OWNER功能。 EAGAIN 队列中没有可用的消息并且在msgflg中指定了IPC_NOWAIT。 EFAULT 无法访问msgp指向的地址。 EIDRM 当进程正在休眠以接收消息时消息队列已被删除。 EINTR 当进程正在休眠以接收消息时进程捕获到一个信号参见signal(7)。 EINVAL msgqid无效或者msgsz小于0。 ENOMSG 在msgflg中指定了IPC_NOWAIT并且消息队列中不存在请求类型的消息。 */控制消息队列 ipcs(8)程序使用IPC_INFO、MSG_STAT和MSG_INFO操作来提供有关所分配资源的信息。将来这些文件可能会被修改或移动到/proc文件系统接口。 #include sys/types.h #include sys/ipc.h #include sys/msg.hstruct msginfo {int msgpool; // 用于保存消息数据的缓冲池的大小以千字节为单位内核中未使用int msgmap; // 消息映射中的最大条目数内核中未使用int msgmax; // 单个消息中可写入的最大字节数int msgmnb; // 可以写入队列的最大字节数用于在创建队列期间初始化msg_qbytesmsgget(2)int msgmni; // 最大消息队列数int msgssz; // 消息段大小内核中未使用int msgtql; // 系统中所有队列上的最大消息数内核中未使用unsigned short int msgseg; // 最大分段数内核中未使用 };struct ipc_perm {key_t __key; // 提供给msgget(2)的密钥uid_t uid; // 所有者的有效UIDgid_t gid; // 所有者的有效GIDuid_t cuid; // 创建者的有效UIDgid_t cgid; // 创建者的有效GIDunsigned short mode; // 访问权限unsigned short __seq; // 序列号码 };struct msqid_ds {struct ipc_perm msg_perm; // 所有权和权限time_t msg_stime; // 最后成功调用msgsnd()的时间time_t msg_rtime; // 最后成功调用msgrcv()的时间time_t msg_ctime; // 最后更改的时间unsigned long __msg_cbytes; // 队列中的当前字节数非标准msgqnum_t msg_qnum; // 队列中的当前消息数msglen_t msg_qbytes; // 队列中允许的最大字节数pid_t msg_lspid; // 最后调用msgsnd()的进程PIDpid_t msg_lrpid; // 最后调用msgrcv()的进程PID }; int msgctl(int msgid, int cmd, struct msqid_ds *buf); /** brief msgctl()对标识符为msqid的消息队列执行cmd指定的控制操作如修改消息队列的属性、删除消息队列等 param msgid 消息队列的标识符表示要控制哪个消息队列 param cmd 需要执行的命令可选值如下IPC_STAT 将信息从与msqid相关联的内核数据结构复制到buf指向的msqid_ds结构中。调用方必须具有对消息队列的读取权限。IPC_SET 将buf指向的msqid_ds结构的一些成员的值写入与此消息队列相关联的内核数据结构同时更新其msg_ctime成员。结构的以下成员将更新msg_qbytes、msg_perm.uid、msg_pterm.gid和的最低有效9位msg_perm.mode。调用进程的有效UID必须与消息队列的所有者msg_perm.UID或创建者msg_pterm.cuid匹配或者调用方必须具有特权。将msg_qbytes值提升到系统参数MSGMNB之外需要适当的权限LinuxCAP_IPC_RESOURCE功能。IPC_RMID 立即删除消息队列唤醒所有等待的读写器进程返回错误并将errno设置为EIDRM。调用进程必须具有适当的权限或者其有效的用户ID必须是消息队列的创建者或所有者的ID。IPC_INFO 返回有关系统范围的消息队列限制和buf指向的结构中的参数的信息。如果定义了_GNU_SOURCE功能测试宏则此结构的类型为msginfo因此需要强制转换在sys/msg.h中定义实际内容如上方展示的struct msginfo;MSG_INFO 特定于Linux返回一个msginfo结构该结构包含与IPC_INFO相同的信息只是返回以下字段其中包含有关消息队列消耗的系统资源的信息msgpool字段返回系统上当前存在的消息队列数msgmap字段返回系统上所有队列中的消息总数msgtql字段返回系统上所有队列中所有消息的总字节数。MSG_STAT 特定于Linux返回与IPC_STAT相同的msqid_ds结构。但是msqid参数不是队列标识符而是内核内部数组的索引用于维护系统上所有消息队列的信息。 param buf msqid_ds数据类型的地址用来存放或更改消息队列的属性 return 成功后IPC_STAT、IPC_SET和IPC_RMID返回0。成功的IPC_INFO或MSG_INFO操作返回内核内部数组中使用次数最多的条目的索引该数组记录了有关所有消息队列的信息。此信息可与重复的MSG_STAT操作一起使用以获得有关系统上所有队列的信息。成功的MSG_TAT操作将返回索引在msqid中给出的队列的标识符。失败返回-1并设置错误码errno错误码errno类型 EACCES 参数cmd等于IPC_STAT或MSG_STAT但调用进程对消息队列msqid没有读取权限也不具有CAP_IPC_OWNER功能。 EFAULT 参数cmd的值为IPC_SET或IPC_STAT但buf指向的地址不可访问。 EIDRM 消息队列已删除。 EINVAL cmd或msqid的值无效。或者对于MSG_STAT操作msqid中指定的索引值引用了当前未使用的数组槽。 EPERM 参数cmd的值为IPC_SET或IPC_RMID但调用进程的有效用户ID不是消息队列的创建者在msg_perm.cuid中找到或所有者在msg_prerm.uid中找到并且该进程没有特权Linux它不具有CAP_SYS_ADMIN功能。 */消息队列的使用例程 /// 待补充 提示先做内容框架梳理后期进行完善补充
http://wiki.neutronadmin.com/news/260255/

相关文章:

  • 工信部网站备案注销wordpress 树
  • 建设银行什么网站可买手表全球十大网站排名
  • 河南省建设厅广州网站优化排名推广
  • 完成网站的建设工作总结wordpress用户邮箱验证码
  • 校园网站规划与建设心得如何在腾讯云做网站
  • 网站导航网站开发网站设计在线培训
  • 做网站可以赚多少钱it网站开发
  • 网站开发 一般用什么语言表白网站是怎么做的
  • wordpress一步步建企业网站外贸销售怎么找客户
  • 做国内打不开的网站吗徐州seo排名公司
  • 阿里云安装wordpress数据库错误网站seo如何做
  • 销售类网站开发架构阳朔县建设规划局网站
  • 珠海做网站的公司网站建设需要哪些技术
  • 中山网站建设是什么安徽城乡建设厅网站
  • 网站制作top用阿里云怎么建网站
  • 哪些网站会盗取湛江市住房和城乡建设网站
  • 潍坊网站建设外包一哥优购物官方网站
  • 校园网站做自己的广告平面设计学习
  • 网站域名和空间做网页和网站有什么区别吗
  • 在线做海报网站企业网站功能
  • 西宁建设网站东莞网络营销公司
  • 上海建网站网络广告怎么做
  • 安监局网站做模拟邓州网站推广
  • 甘肃泾川县门户网站两学一做No商业网站建设
  • 西宁seo网站安徽网页设计培训
  • 国字型网站建设布局wordpress api下载文件
  • 设计班级网站建设网站建设及模板使用教程
  • 简单网站建设哪家便宜网络营销的特征
  • 网站开发教程百度云浏览器网站大全免费
  • 在上海做兼职在哪个网站好电商网站建设免费