linux网络编程之POSIX消息队列

POSIX IPC名字限定:

必须以/打头,并且后续不能有其它/ ,形如/somename

长度不能超过NAME_MAX

 

通过下面的命令将消息队列挂载到/dev/mqueue下,可通过cat/dev/mqueue/name查看消息队列状态

mount -t mqueue none /dev/mqueue

mq_open函数:

功能:用来创建和访问一个消息队列

原型

mqd_t mq_open(const char *name, int oflag);

mqd_t mq_open(const char *name, int oflag, mode_tmode, struct mq_attr *attr);

参数

name: 某个消息队列的名字

oflag:与open函数类似,可以是O_RDONLY、O_WRONLY、O_RDWR,还可以按位或上O_CREAT、O_EXCL、O_NONBLOCK等。

mode:如果oflag指定了O_CREAT,需要设置mode。

返回值:成功返回消息队列文件描述符;失败返回-1

 

mq_unlink函数:

功能:删除消息队列

原型

mqd_t mq_unlink(const char *name);

参数

name: 消息队列的名字

返回值:成功返回0;失败返回-1

 

mq_getattr/mq_setattr函数:

功能:获取/设置消息队列属性

原型

mqd_t mq_getattr(mqd_t mqdes, struct mq_attr *attr);

mqd_t mq_setattr(mqd_t mqdes, struct mq_attr *newattr,struct mq_attr *oldattr);

返回值:成功返回0;失败返回-1

 

 

mq_attr结构体:

struct mq_attr {

    longmq_flags;    /* Flags: 0 or O_NONBLOCK */

    longmq_maxmsg;   /* Max. # of messages onqueue */

    longmq_msgsize;  /* Max. message size (bytes)*/

    longmq_curmsgs;  /* # of messages currently inqueue */

};

 

mq_send函数:

功能:发送消息

原型

mqd_t mq_send(mqd_t mqdes, const char *msg_ptr, size_tmsg_len, unsigned msg_prio);

参数

mqdes:消息队列描述符

msg_ptr:指向消息的指针

msg_len:消息长度

msg_prio:消息优先级

返回值:成功返回0;失败返回-1

 

mq_receive函数:

功能:接收消息

原型

ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, size_tmsg_len, unsigned *msg_prio);

参数

mqdes:消息队列描述符

msg_ptr:返回接收到的消息

msg_len:消息长度

msg_prio:返回接收到的消息优先级

返回值:成功返回接收到的消息字节数;失败返回-1

注意:返回指定消息队列中最高优先级的最早消息

 

mq_notify函数:

功能:建立或者删除消息到达通知事件

原型

mqd_t mq_notify(mqd_t mqdes, const struct sigevent*notification);

参数

mqdes:消息队列描述符

notification:

非空表示当消息到达且消息队列先前为空,那么将得到通知;

NULL表示撤消已注册的通知

返回值:成功返回0;失败返回-1

通知方式:

产生一个信号

创建一个线程执行一个指定的函数

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 for thread notification */

    void       *sigev_notify_attributes;

                  /*Thread function attributes */

};

 

mq_notify注意:

任何时刻只能有一个进程可以被注册为接收某个给定队列的通知

当有一个消息到达某个先前为空的队列,而且已有一个进程被注册为接收该队列的通知时,只有没有任何线程阻塞在该队列的mq_receive调用的前提下,通知才会发出。

当通知被发送给它的注册进程时,其注册被撤消。进程必须再次调用mq_notify以重新注册(如果需要的话),重新注册要放在从消息队列读出消息之前而不是之后。

 

你可能感兴趣的:(Linux网络编程,Posix消息队列)