用管道(pipe)使消息队列通知(mq_notify)可以在Select和poll中使用
来源:互联网 发布:js button disabled 编辑:程序博客网 时间:2024/05/17 04:13
这是在Unix网络编程第二卷进程间通信中看到的一个技巧。它使得posix消息队列的mq_notify可以在select中使用。具体方法为:
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
0 0
- 用管道(pipe)使消息队列通知(mq_notify)可以在Select和poll中使用
- 用管道(pipe)使消息队列通知(mq_notify)可以在Select和poll中使用
- Posix消息队列 异步通知 mq_notify函数
- pipe和消息队列
- linux下使用管道pipe和select创建阻塞
- select(poll)在应用程序中如何使用
- select(poll)在应用程序中如何使用
- Posix消息队列——mq_notify函数
- Posix消息队列——mq_notify函数
- 在.NET程序中使用PIPE(管道技术)
- 在.NET程序中使用PIPE(管道技术)
- 消息管道(Message Pipe)
- 消息管道(Message Pipe)
- Ionic2中使用管道(Pipe)
- select,poll和epoll使用
- select,poll和epoll使用
- poll() 和select()使用总结
- select,poll和epoll使用
- POJ 2418 Hardwood Species
- 访问phpmyadmin出现空白界面
- c# 容器的双缓冲
- 算法题:求数组中最小的k个数
- maven环境
- 用管道(pipe)使消息队列通知(mq_notify)可以在Select和poll中使用
- uva10405 - Longest Common Subsequence(LCS,最长公共子序列)
- Leetcode - Pointers/Array - Two sum
- 推荐一款Java代码Bug分析插件 FindBugs
- 虚函数之:构造和析构
- 解决cppunit编译错误,未定义的dlsym,dlopen和dlclose
- EXTJS的遮罩效果
- Activity之间数据传递onActivityResult
- 14.jQuery 工具函数