Posix消息队列
一、函数mq_open头文件mqueue.h; ? 原型mqd_t mq_open(const char *name,int oflag,.../*mode_t mode,struct mq_attr* attr*/); ? 函数功能创建消息队列; ? 参数name?:消息队列的名字,根据消息队列的规则,为了更好的可移植性,该名字必须以‘/’开头,创建一个消息队列的时候无须路径,给出名字就好,其存放位置可有自己指定(创建前后都可以)。 ? oflag:O_RDONLY(只读)?O_WRONLY(只写)?O_RDWR(可读可写)O_CREAT(创建)?O_EXCL?(当消息已存在时,返回EEXIST错误到errno中)O_NONBLOCK(设置非阻塞) ? mode:在oflag中指定O_CREAT时,此参数是需要的。表示创建消息队列的权限,S_IRUSR,S_IWUSR,S_IXUSR,S_IRGRP,S_IWGRP,S_IXGRP,S_IROTH,S_IWOTH,S_IXOTH相或组成或者写成0777(表示rwxrwxrwx)等用八进制表示也可以。 ? attr:在oflag中指定O_CREAT时,此参数是需要的。存放消息队列的属性。其中mq_flags为0,表示阻塞,为O_NONBLOCK为非阻塞。 (这里可以填写哪些参数具体看:二、Posix IPC) ? 返回值若创建成功则返回消息队列的描述符,否则返回-1。 ? ? ? mq_close函数头文件mqueue.h 原型int mq_close(mqd_t mqdes); 函数功能关闭已打开的消息队列,关闭后调用进程不可以再使用该描述符,但其消息队列并没有被删除。一个进程终止时,它的所有打开着的消息队列都关闭,就像调用了mq_close一样。 参数mqdes?消息队列的描述符,即消息队列创建成功后的返回值。 返回值成功返回0,失败返回-1。 ? ? mq_unlink头文件mqueue.h 原型int mq_unlink(const char *name); 函数功能从系统中删除名为name的消息队列,但删除的只是我们可以在系统中看见的文件的名字,但文件本身并没有被从磁盘上删除,除非该名称是文件的最后一个链接,并且该文件已关闭,才会将该文件真正从磁盘上删除。即如果某前该详细队列的文件还在其他进程中打开,那么不会将其从磁盘上删除,又或者这是最后一个链接,但它还为关闭,即未执行ma_close操作,或打开它的进程为结束就执行mq_unlink,它也不会从磁盘上删除。 参数name消息队列的名称,以‘/’开始。 返回值成功返回0,出错返回-1。 ? ? mq_getattr头文件mqueue.h 原型int mq_getattr(mqd_t mqdes,struct mq_attr *attr); 函数功能获取mqdes指的消息队列的属性,存放到attr结构体中。 struct mq_attr { ? long int mq_flags;????/* Message queue flags:0,O_NONBLOCK */ long int mq_maxmsg;???/* Maximum number of messages.??*/ long int mq_msgsize;??/* Maximum message size.??*/ long int mq_curmsgs;??/* Number of messages currently queued.??*/ long int __pad[4]; ? }; 参数mqdes为消息队列描述符,attr为上面解释的存放消息队列属性的结构体。 返回值成功返回0,失败返回-1。 ? ? mq_setattr头文件mqueue.h 原型int mq_setattr(mqd_t mqdes,const struct mq_attr *attr, ?struct mq_attr *oattr); 函数功能设置消息队列的属性,但是只使用attr结构体中的mq_flags属性,以设置(O_NONBLOCK)或清除(0)非阻塞标志。该结构体的另外三个属性被忽略,每个队列的最大消息数和每个消息的最大字节数都只能在创建时设置,当前队列中的消息数是随传送消息和读取消息的操作改变的,只能读取不能设置。如果oattr非空,那么指定队列的先前属性(4个)全将返回到由该指针指向的结构体中。 参数mqdes?消息队列的属性 attr?函数功能解释中 oattr?函数功能解释中 返回值成功返回0,失败返回-1。 ? ? ? mq_send头文件mqueue.h 原型int mq_send(mqd_t mqdes,const char *ptr,size_t len, ?unsigned int prio); 函数功能给描述符mqdes指向的消息队列发送消息,大小为len,内容存放在ptr中,prio为优先级。 参数mqdes为要发送消息的消息队列描述符; ptr为要发送的数据; len为消息的长度; prio为消息的优先级; 返回值成功返回0,失败返回-1。 ? ? mq_receive头文件mqueue.h 原型ssize_t mq_receive(mqd_t mqdes,char *ptr, ?unsigned int *proip); 函数功能从描述符mqdes指向的消息队列中读取消息存放ptr中。 参数mqdes为要从中读取消息的消息队列的描述符; ptr为存放接受到的消息的指针; len为接受的最大长度; 该值不能小于能加到该消息对列上的最大大小,如果len小于该值,就立即返回EMSGSIZE错误。 返回值成功返回读取消息的内容的字节数,出错返回-1。 ? ? mq_notify头文件mqueue.h; signal.h; 原型int mq_notify(mqd_t mqdes,const struct sigevent *notification); 函数功能为指定队列建立或删除异步事件通知。 参数在<signal.h>中: ???typedef union sigval { ????????int sival_int; ????????void __user *sival_ptr; } sigval_t; typedef struct sigevent { ????????sigval_t sigev_value; ????????int sigev_signo; ????????int sigev_notify; ????????void??(*sigev_notify_function)(union sigval); ????????Pthread_attr_t *sigev_notify_attributes; } sigevent_t; (1).如果notification参数非空,那么当前进程希望在有一个消息到达所指定的先前为空的队列时得到通知。我们说“该进程被注册为接收该队列的通知”。 (2).如果notification参数为空指针,而且当前进程目前被注册为接收所指定队列的通知,那么已存在的注册将被撤销。 (3).任意时刻只有一个进程可以被注册为接收某个指定队列的通知。 (4).当有一个消息到达某个先前为空的队列,而且已有一个进程被注册为接收该队列的通知时,只有在没有任何线程阻塞在该队列的mq_receive调用中的前提下,通知才会发出。这就是说,在mq_receive调用中的阻塞比任何通知的注册都优先。 (5).当该通知被发送给它的注册进程时,其注册即被撤销。该进程必须再次调用mq_notify重新注册(如果想要的话)。 返回值成功返回0,失败返回-1。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |