14.msgrcv() 功能:从消息队列中取得指定类型的消息. 语法:#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgrcv(msqid,msgp,msgsz,msgtyp,msgflg) int msqid; void *msgp; int msgsz; long msgtyp; int msgflg; 说明:本系统调用从由msqid指定的消息队列中读取一个由msgtyp指定 类型的消息到由msgp指向的缓冲区中,同样的,该缓冲区的结构如
前所述,包括消息类型和消息正文.msgsz为可接收的消息正文的 字节数.若接收到的消息正文的长度大于msgsz,则会被截短到 msgsz字节为止(当消息标志msgflg&MSG_NOERROR为真时),截掉的
部份将被丢失,而且不通知消息发送进程. msgtyp指定消息类型: . 为0则接收消息队列中第一个消息. . 大于0则接收消息队列中第一个类型为msgtyp的消息. . 小于0则接收消息队列中第一个类型值不小于msgtyp绝对值且 类型值又最小的消息. msgflg指定操作行为: . 若(msgflg&IPC_NOWA99v)是真的,调用进程会立即返回,若没有 接收到消息则返回值为-1,errno设置为ENOMSG. . 若(msgflg&IPC_NOWA99v)不是真的,则调用进程会被挂起直到下
面情况之一发生: * 队列中的消息的类型是有效的. * 消息队列标志被系统删除.系统调用返回-1. * 调用进程接收到一个未被忽略的中断信号,调用进程继续 执行或被终止. 调用成功后,对应指定的消息队列的相关结构做如下动作: . 消息数(msg_qnum)减1. . 消息队列最近接收进程号(msg_lrpid)改为调用进程号. . 消息队列接收时间(msg_rtime)改为当前系统时间. 以上信息可用命令ipcs -a看到. 返回值:调用成功则返回值等于接收到实际消息正文的字节数. 不成功则返回-1. 15.msgctl() 功能:消息控制操作 语法:#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgctl(msqid,cmd,buf) int msqid,cmd; struct msqid_ds *buf; 说明:本系统调用提供一系列消息控制操作,操作动作由cmd定义,以下 cmd定义值表明了各操作动作的定义. . IPC_STAT:将msqid相关的数据结构中各个元素的当前值放入由
buf指向的结构中. . IPC_SET:将msqid相关的数据结构中的下列元素设置为由buf指
向的结构中的对应值. msg_perm.uid msg_perm.gid msg_perm.mode msg_qbytes 本命令只能由有效UID等于msg_perm.cuid或msg_perm.uid的
进程或有效UID有合适权限的进程操作.只有具有合适权限的
用户才能增加msg_qbytes的值. . IPC_RMID:删除由msqid指示的消息队列.将它从系统中删除并 破坏相关的数据结构. 本命令只能由有效UID等于msg_perm.cuid或msg_perm.uid的
进程或有效UID有合适权限的进程操作. 返回值:调用成功则返回值为0,否则为-1. 16.msgget() 功能:取得一个消息队列. 语法:#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgget(key,msgflg) key_t key; int msgflg; 说明:本系统调用返回与参数key相关的消息队列的标识符. 若以下事实成立,则与消息队列相关的标识符和数据结构将被创 建出来: . 若参数key等于IPC_PRIVATE. . 若参数key没有一个已存在的消息队列标识符与之相关,同时值
(msgflg&IPC_CREAT)为真. 创建消息队列时,与新的消息队列标识符相关的数据结构将被初 始化为如下: . msg_perm.cuid和msg_perm.uid设置为调用进程的有效UID. . msg_perm.cgid和msg_perm.gid设置为调用进程的有效GID. . msg_perm.mode访问权限比特位设置为msgflg访问权限比特位.
. msg_qnum,msg_lspid,msg_lrpid,msg_stime,msg_rtime设置为0 . . msg_ctime设置为当前系统时间. . msg_qbytes设置为系统允许的最大值. 返回值:调用成功则返回一非0值,称为消息队列标识符;否则返回值为-1 . 例子:本例将包括上述所有消息队列操作的系统调用: #define RKEY 0x9001L /*读消息队列的KEY值*/ #define WKEY 0x9002L /*写消息队列的KEY值*/ #define MSGFLG 0666 /*消息队列访问权限*/ #define IPC_WA99v 0 /*等待方式在include文件中未定义[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] 下一页
|