IPC通信

【IPC通信】Posix消息队列使用非阻塞mq_receive的信号通知

落花浮王杯 提交于 2019-12-06 09:33:00
某个空的消息队列被放置一个消息时通过产生一个信号通知进程,进程取走消息。 #include <stdio.h> #include <stdlib.h> #include <mqueue.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <signal.h> volatile sig_atomic_t mqflag; // 被信息处理函数设置为非0值 void sig_usr1(int); int main(int argc, char *argv[]) { mqd_t mqd; char *ptr; struct mq_attr attr; struct sigevent sigev; sigset_t zeromask, newmask, oldmask; // 信号集 unsigned int prio; size_t n; int rc; if(argc != 2) { printf("Usage: mqnotifysig3 <name>\n"); exit(1); } /*只读模式打开消息队列,同时指定非阻塞标志*/ mqd = mq_open(argv[1], O_RDONLY); if(mqd

【IPC通信】Posix消息队列使用异步事件通知

不羁的心 提交于 2019-12-06 09:32:50
mq_notify()函数为指定队列建立或删除异步事件通知,建立通知即某空消息队列中如有新的消息,会发送一个信号或创建一个线程来执行指定的函数。 #include <mqueue.h> int mq_notify(mqd_t mqdes, const struct sigevent *notification); 成功返回0,出错则为-1 给出struct sigevent定义: union signal { int sival_int; /*整数值*/ void *sival_ptr; /*指针值*/ }; struct sigevent { int sigev_notify; /*通知类型:SIGEV_NONE、SIGEV_SIGNAL、SIGEV_THREAD*/ int sigev_signo; /*信号值*/ union sigval sigev_value; /*传递给信号处理函数或线程的信号值*/ void (*sigev_notify_function)(union sigval); /*线程处理函数*/ pthread_attr_t *sigev_notify_attributes; /*线程属性*/ }; 下面给出示例代码: #include <stdio.h> #include <stdlib.h> #include <mqueue.h> #include

【IPC通信】Posix消息队列的属性设置

回眸只為那壹抹淺笑 提交于 2019-12-06 09:32:38
Posix消息队列的属性使用如下结构存放: struct mq_attr { long mq_flags; /*阻塞标志位,0为非阻塞(O_NONBLOCK)*/ long mq_maxmsg; /*队列所允许的最大消息条数*/ long mq_msgsize; /*每条消息的最大字节数*/ long mq_curmsgs; /*队列当前的消息条数*/ }; 队列可以在创建时由mq_open()函数的第四个参数指定 mq_maxmsg, mq_msgsize。 如创建时没有指定则使用默认值,一旦创建,则不可再改变。 队列可以在创建后由mq_setattr()函数设置 mq_flags 。 #include <mqueue.h> /*取得消息队列属性,放到mqstat地fh*/ int mq_getattr(mqd_t mqdes, struct mq_attr *mqstat); /*设置消息队列属性,设置值由mqstat提供,原先值写入omqstat*/ int mq_setattr(mqd_t mqdes, const struct mq_attr *mqstat, struct mq_attr *omqstat); 均返回:若成功则为0,若出错为-1 下面通过程序获取和设置消息队列的默认属性: #include <stdio.h> #include <stdlib.h>

【IPC通信】Posix消息队列的创建

烂漫一生 提交于 2019-12-06 09:32:28
消息队列可以认为是一个消息链表。进程(线程)可以往里写消息,也可以从里面取出消息。 前面讲到的管道和FIFO在写入消息时必须有进程读,否则是一直阻塞的。而消息队列则不同,一个进程可以往某个消息队列里写消息,然后终止,另一个进程随时可以从消息队列里取走这些消息。这里也说明了,消息队列具有随内核的持续性,也就是系统不重启,消息队列永久存在。 #include <mqueue.h> /* 函数说明:函数创建或打开一个消息队列 返回值:成功返回消息队列描述符,失败返回-1,错误原因存于errno中 */ mqd_t mq_open(const char *name, int oflag, .../* mode_t mode, struct mq_attr *attr */); /* 函数说明:关闭一个打开的消息队列,表示本进程不再对该消息队列读写 返回值:成功返回0,失败返回-1,错误原因存于errno中 */ int mq_close(mqd_t mqdes); /* 函数说明:删除一个消息队列,好比删除一个文件,其他进程再也无法访问 返回值:成功返回0,失败返回-1,错误原因存于errno中 */ int mq_unlink(const char *name); 下面通过程序看一下如何创建(并打开)、关闭、删除一个消息队列。 #include <stdio.h> #include

【IPC通信】Posix消息队列读写

你离开我真会死。 提交于 2019-12-05 13:43:04
先给出创建消息队列的程序: #include <stdio.h> #include <stdlib.h> #include <mqueue.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #define MQ_NAME ("/tmp") #define MQ_FLAG (O_RDWR | O_CREAT | O_EXCL) // 创建MQ的flag #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) // 设定创建MQ的权限 int main() { mqd_t posixmq; int rc = 0; struct mq_attr mqattr; mqattr.mq_maxmsg = 3; mqattr.mq_msgsize = 1024; posixmq = mq_open(MQ_NAME, MQ_FLAG, FILE_MODE, &mqattr); // 创建只可存放三条消息的消息队列 if(-1 == posixmq) { perror("创建MQ失败"); exit(1); } rc = mq_close(posixmq); if(0 != rc)