用管道(pipe)使消息队列通知(mq_notify)可以在Select和poll中使用
2013-05-26 16:04
781 查看
这是在Unix网络编程第二卷进程间通信中看到的一个技巧。它使得posix消息队列的mq_notify可以在select中使用。具体方法为:
1、建立管道;
2、在主线程中用select监听管道的读事件;
3、在mq_notify的时间处理程序中往管道里写数据,通知主线程
只是不知道这样做,效率怎么样。
UNP-IPC有一段实例代码,如下:
1、建立管道;
2、在主线程中用select监听管道的读事件;
3、在mq_notify的时间处理程序中往管道里写数据,通知主线程
只是不知道这样做,效率怎么样。
UNP-IPC有一段实例代码,如下:
1 #include "unpipc.h" 2 3 int pipefd[2]; 4 static void sig_usr1(int); 5 /* $$.bp$$ */ 6 int 7 main(int argc, char **argv) 8 { 9 int nfds; 10 char c; 11 fd_set rset; 12 mqd_t mqd; 13 void *buff; 14 ssize_t n; 15 struct mq_attr attr; 16 struct sigevent sigev; 17 18 if (argc != 2) 19 err_quit("usage: mqnotifysig5 <name>"); 20 21 /* 4open queue, get attributes, allocate read buffer */ 22 mqd = Mq_open(argv[1], O_RDONLY | O_NONBLOCK); 23 Mq_getattr(mqd, &attr); 24 buff = Malloc(attr.mq_msgsize); 25 26 Pipe(pipefd); 27 28 /* 4establish signal handler, enable notification */ 29 Signal(SIGUSR1, sig_usr1); 30 sigev.sigev_notify = SIGEV_SIGNAL; 31 sigev.sigev_signo = SIGUSR1; 32 Mq_notify(mqd, &sigev); 33 34 FD_ZERO(&rset); 35 for ( ; ; ) { 36 FD_SET(pipefd[0], &rset); 37 nfds = Select(pipefd[0] + 1, &rset, NULL, NULL, NULL); 38 39 if (FD_ISSET(pipefd[0], &rset)) { 40 Read(pipefd[0], &c, 1); 41 Mq_notify(mqd, &sigev); /* reregister first */ 42 while ( (n = mq_receive(mqd, buff, attr.mq_msgsize, NULL)) >= 0) { 43 printf("read %ld bytes\n", (long) n); 44 } 45 if (errno != EAGAIN) 46 err_sys("mq_receive error"); 47 } 48 } 49 exit(0); 50 } 51 52 static void 53 sig_usr1(int signo) 54 { 55 Write(pipefd[1], "", 1); /* one byte of 0 */ 56 return; 57 } 58
转自http://www.cppblog.com/mildforest/archive/2011/02/24/140611.aspx
相关文章推荐
- 用管道(pipe)使消息队列通知(mq_notify)可以在Select和poll中使用
- Posix消息队列使用非阻塞mq_receive的信号通知
- RabbitMQ .NET消息队列使用入门(一)【简单示例】
- 通知栏发送消息Notification(可以使用自定义的布局)
- 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)
- MQ消息队列使用场景
- ActiveMq C#客户端 消息队列的使用(存和取)
- ActiveMq C#客户端 消息队列的使用(存和取)
- PHP使用php-resque库配合Redis实现MQ消息队列的教程
- RabbitMQ .NET消息队列使用入门(一)【简单示例】
- linux进程通信:使用posix消息队列mq进行线程或进程间的通信
- Linux系统下使用mail发送一封简单的Internet邮件【以及验证邮件是否发送成功sendmail -bp,必须是root用户才可以使用此命令查看邮件消息队列中的内容】
- 关于消息队列的使用----ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
- MQ消息队列系列(2)什么时候使用MQ
- MQ入门总结(一)消息队列概念和使用场景
- Kafka,Mq,Redis作为消息队列使用时的差异?
- RabbitMQ .NET消息队列使用详解
- 通知栏发送消息Notification(可以使用自定义的布局)
- android 配置与使用 阿里消息队列 MQ
- RabbitMQ .NET消息队列使用入门(二)【多个队列间消息传输】