Linux IPC POSIX 消息队列

来源:
导读 大家好,我是本期栏目编辑小友,现在为大家讲解Linux IPC POSIX 消息队列问题。 模型: include m queue h include

大家好,我是本期栏目编辑小友,现在为大家讲解Linux IPC POSIX 消息队列问题。

模型:# include m queue . h # include sys/stat . h # include efcntl . hmq _ open()//创建/获取消息队列fd mq_get() //设置/获取消息队列属性mq_send()/mq_receive() //发送/接收消息MQ _ close()。断开消息队列mq_unlink() //删除消息队列POSIX mq VS Sys V mq优点更简单的基于文件的应用程序接口完全支持消息优先级(优先级最终决定消息在队列中的位置),完全支持消息到达的异步通知。这种阻止发送和接收操作的超时机制是通过信号或线程创建来实现的。$man mq_overview知道消息队列的名称:消息队列由类似“/somename”的名称唯一标识,名称字符串的最大长度不能朝向oh name _ max(即255)。这两个进程使用相同的消息队列名称进行通信。

Mq_open()//创建POSIX消息队列或打开现有消息队列,成功返回其他函数的消息队列描述符mqdes,未能返回(mqd_t)-1 Set errno//link with-LRT。MQD _ t MQ _ Open (constchar * name,int of lag);mqd_t mq_open(const char *name,int oflag,mode_t mode,struct MQ _ attr * attr);必须包含:中的一个

O_RDONLY表示以只接收消息的形式打开消息队列O_WRONLY表示以只发送消息的形式打开消息队列O_RDWR表示以接收和发送的形式打开消息队列可Bitwised ORed:

O _ NONBLOCK以非阻塞模式打开消息队列,如果消息队列不存在,则创建一个消息队列。消息队列所有者的UID设置为调用进程的effecTIve UID,GID设置为调用进程的effecTIve GIDO _ exco,以确保创建消息队列。出现错误模式。如果oflag中有O_CREAT,则模式用于指示新创建的消息队列的权限属性。如果oflag中有O_CREAT,则attr指示消息队列的属性。如果attr为NULL,将根据默认设置配置消息队列(有关详细信息,请参见mq_overview(7))。).

mq_setattr()/mq_getattr()//设置/修改/获取消息队列属性,成功返回0,失败返回-1。set errno//link with-lrt.int MQ _ setattr(mqd _ t mqdes,const struct MQ _ attr * newattr,struct MQ _ attr *)。int mq_getattr(mqd_t mqdes,struct MQ _ attr * attr);Mqattr结构

struct mq _ attr { long mq _ flags/* flag s 3360 0或O _ NONBLOCK */long MQ _ maxmsg;/* Max。队列中的消息数*/long MQ _ msg size;/* Max。消息大小(字节)*/long MQ _ curmsgs;/* #当前队列中的消息*/};mq_send()/mq_TImesend()//向mqdes指向的消息队列发送消息。成功为0,失败为-1。set errno//link with-lrt.int MQ _ send(mqd _ t mqdes,constchar * msg _ ptr,size _ t msg _ len,无符号int msg _ prio);//如果消息队列已满#includeTIme.h //附加头int MQ _ time send(mqd _ t MQ des,constchar * msg _ ptr,size _ t msg _ len,无符号int msg _ prio,const struct time spec * ABS _ time out);msg_lenmsg_ptr指向的消息队列长度必须=消息队列中消息的长度,可以是0msg_prio,这是一个用于表示消息优先级的非零整数。消息按照优先级递减的顺序放在消息队列中。对于相同优先级的消息,如果消息队列已满,新消息将在旧消息之后进入阻塞状态,新消息必须等到消息队列有空间进入,否则呼叫会被信号中断。如果标志中有O_NOBLOCK选项,它将直接报告错误abs_timeout:如果消息队列已满,它将根据abs_timeout指向的结构所指示的时间被锁定。内部时间以微秒计,从970-01-01 00:033600000(世界协调时)。如果时间到了,MQ _ times。

结构时间表

{ time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */};mq_receive()/mq_timedreceive()

//从消息队列中取出优先级最高的里面的最老的消息,成功返回消息取出消息的大小,失败返回-1设errno//具体功能参照mq_send()/mq_timesend()//Link with -lrt.ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned int *msg_prio);#include<time.h> //额外的headerssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned int *msg_prio, const struct timespec *abs_timeout);mq_notify()

//允许调用进程注册或去注册同步来消息的通知,成功返回0,失败返回-1设errno//Link with -lrt.int mq_notify(mqd_t mqdes, const struct sigevent *sevp);

sevp指向sigevent的指针

如果sevp不是NULL,那么这个函数就将调用进程注册到通知进程,只有一个进程可以被注册为通知进程如果sevp是NULL且当前进程已经被注册过了,则去注册,以便其他进程注册

union sigval { /* Data passed with notification */ int sival_int; /* Integer value */ void* sival_ptr; /* Pointer value */};struct sigevent { int sigev_notify; /* Notification method */ int sigev_signo; /* Notification signal */ union sigval sigev_value; /* Data passed with notification */ void(*sigev_notify_function) (union sigval); //Function used for thread notification (SIGEV_THREAD) void* sigev_notify_attributes; // Attributes for notification thread (SIGEV_THREAD) pid_t sigev_notify_thread_id; /* ID of thread to signal (SIGEV_THREAD_ID) */};

sigev_notify使用下列的宏进行配置:

SIGEV_NONE调用进程仍旧被注册,但是有消息来的时候什么都不通知SIGEV_SIGNAL通过给调用进程发送sigev_signo指定的信号来通知进程有消息来了SIGEV_THREAD一旦有消息到了,就激活sigev_notify_function作为新的线程的启动函数mq_close()

//关闭消息队列描述符mqdes,如果有进程存在针对这个队列的notification request,那么也会被移除//成功返回0,失败返回-1设errno//Link with -lrt.int mq_close(mqd_t mqdes);mq_unlink():

//移除队列名指定的消息队列,一旦最后一个进程关闭了针对这个消息队列的描述符,就会销毁这个消息队列//成功返回0,失败返回-1设errno//Link with -lrt.int mq_unlink(const char *name);

标签:

版权声明:转载此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系,我们将及时更正、删除,谢谢您的支持与理解。