POSIX消息队列可以注册空队列有消息到达时所触发的信号,而信号触发对应的信号处理函数。

下面是一份基本的消息队列和信号处理结合的代码(修改自UNIX网络编程:进程间通信)

#include <stdio.h>
#include <stdlib.h> #include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <mqueue.h>
#include <signal.h>
#include <pthread.h> mqd_t queue;
void* buff;
struct mq_attr attr;
struct sigevent sigev; static void sig_user1(int signo) {
printf("current pid:%d, threadid:%u\n", getpid(), pthread_self());
int n, prio;
/* signal will be unregistered from previous registered message queue
when first message arrived.
So register signal again if we want trigger the signal handler again */
mq_notify(queue, &sigev); /* read msg */
int res = mq_receive(queue, buff, attr.mq_msgsize, &prio);
if (res < ) {
perror("receive msg fail");
exit(-);
}
printf("prio: %d, msg: %s\n", prio, (char*)buff);
return;
} int main(int argc, char** argv) {
char* name = "/testmq";
if (argc > ) {
name = argv[];
} queue = mq_open(name, O_RDONLY); if (queue < ) {
perror("open message queue fail");
return -;
} int res = mq_getattr(queue, &attr);
if (res != ) {
perror("get message queue fail");
return -;
} buff = malloc(attr.mq_msgsize); signal(SIGUSR1, sig_user1); sigev.sigev_notify = SIGEV_SIGNAL;
sigev.sigev_signo = SIGUSR1; mq_notify(queue, &sigev); printf("[%d.%d] start to waiting\n", getpid(), pthread_self());
for (;;) {
pause();
} return ;
}

运行输出:

hgf@ubuntu:~/ipc$ ./mqnotify /haha
[25328.1410565952] start to waiting
current pid:, threadid:

可以看到主线程和执行信号处理的线程是同一个,这估计也是书上说以上程序存在问题,因为有些函数调用不应该放在信号处理函数当中。因为它们可能使用了互斥资源可能造成死锁,比如printf,当其正在处理时又来一个信号于是再次调用printf然后可能上一个printf还没有释放对一些互斥资源的所有权造成死锁。

UNIX IPC: POSIX 消息队列 与 信号的更多相关文章

  1. UNIX IPC: POSIX 消息队列

    首先在我的MAC OSX上试了一下虽然有_POSIX_MESSAGE_PASSING的宏定义,但是用gcc编译会提示没有mqueue.h头文件,先放一边.在Ubuntu上使用正常,不过POSIX消息队 ...

  2. Linux IPC POSIX 消息队列

    模型: #include<mqueue.h> #include <sys/stat.h> #include <fcntl.h> mq_open() //创建/获取消 ...

  3. Unix IPC之Posix消息队列(1)

    部分参考:http://www.cnblogs.com/Anker/archive/2013/01/04/2843832.html IPC对象的持续性:http://book.51cto.com/ar ...

  4. Linux IPC实践(7) --Posix消息队列

    1. 创建/获取一个消息队列 #include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For m ...

  5. IPC通信:Posix消息队列

    IPC通信:Posix消息队列 消息队列可以认为是一个链表.进程(线程)可以往里写消息,也可以从里面取出消息.一个进程可以往某个消息队列里写消息,然后终止,另一个进程随时可以从消息队列里取走这些消息. ...

  6. Linux进程间通信(IPC)编程实践(十二)Posix消息队列--基本API的使用

    posix消息队列与system v消息队列的区别: (1)对posix消息队列的读总是返回最高优先级的最早消息,对system v消息队列的读则能够返回随意指定优先级的消息. (2)当往一个空队列放 ...

  7. Linux环境编程之IPC进程间通信(五):Posix消息队列1

    对于管道和FIFO来说.必须应该先有读取者存在.否则先有写入者是没有意义的. 而消息队列则不同,它是一个消息链表,有足够写权限的线程可往别的队列中放置消息,有足够读权限的线程可从队列中取走消息.每一个 ...

  8. 进程间通信--POSIX消息队列

    相关函数: mqd_t mq_open(const char *name, int oflag); mqd_t mq_send(mqd_t mqdes, const char *msg_ptr, si ...

  9. [转]Linux进程通信之POSIX消息队列

    进程间的消息队列可以用这个实现,学习了下. http://blog.csdn.net/anonymalias/article/details/9799645?utm_source=tuicool&am ...

随机推荐

  1. Linux 环境变量加强

    Linux 环境变量加强 # 前言 今天,主要是之前搭建 GO 环境包的使用发现自己对 Linux 环境变量还不是很熟悉. 遇到环境变量的问题还是会有些懵逼.所以,今天写点Linux 环境变量的文章, ...

  2. linux安装spark-2.3.0集群

    (安装spark集群的前提是服务器已经配置了jdk并且安装hadoop集群(主要是hdfs)并正常启动,hadoop集群安装可参考<hadoop集群搭建(hdfs)>) 1.配置scala ...

  3. (转)Javascript模块化编程(三):Require.js的用法

    转自 ruanyifeng 系列目录: Javascript模块化编程(一):模块的写法 Javascript模块化编程(二):AMD规范 Javascript模块化编程(三):Require.js的 ...

  4. 我永远喜欢我的偶像 KIKU

  5. 酱油 Noip2018颓废记

    也不知道写一些什么了 凑和着写写吧 最近十分的¥#&(^ --#%!*%¥^#$# Day -1 上午考了一场试 就\(TM\)考了60分 好不容易积攒起来的信心啊~~~~~~ 就这么垮了~~ ...

  6. Hyper-V如何新建虚拟机

    http://www.xitongtiandi.net/wenzhang/soft/24543.html

  7. Python turtle库学习笔记

    1.简介 Python的turtle库的易操作,对初学者十分友好.对于初学者来说,刚学编程没多久可以写出许多有趣的可视化东西,这是对学习编程极大的鼓舞,可以树立对编程学习的信心.当然turtle本身也 ...

  8. ArrayList分析

    ArrayList概述 ArrayList继承了AbstractList,实现了List接口,底层基于动态数组,容量大小可以动态变化,ArrayList中可以添加null元素,另外,ArrayList ...

  9. Great Expectations

    Dear friend, This game is created based on Dicken's Great Expectations. To colorful the contents, I ...

  10. 常见的错误:FTP连接时出现“227 Entering Passive Mode”

    FTP的主动模式(PORT Mode)及被动模式(Passive Mode) FTP的特殊性: 大多数的TCP服务是使用单个的连接,一般是客户向服务器的一个周知端口发起连接,然后使用这个连接进行通讯. ...