Articles of 消息队列

mq_open() – EACCES,权限被拒绝

我试图从一个特权进程创build一个POSIX消息队列(等待稍后读取),然后从一个非特权进程(发送消息)打开这个消息队列,并且后来的mq_open()返回:EACCES。 如果创build进程和打开进程都是特权或两者都没有特权,mq_open将成功。 我检查了mq_open手册,它说EACCES意味着调用者没有权限打开它在指定的模式,但我不知道什么是“指定模式”… 在特权过程中创build成功: struct mq_attr attr; attr.mq_flags = O_RDONLY; attr.mq_maxmsg = 10; attr.mq_msgsize = 1024; attr.mq_curmsgs = 0; mq_open("/myMq", (O_RDONLY| O_CREAT), (S_IRWXU | S_IRWXG | S_IRWXO) /* 777 */, &attr); 在无特权的过程中打开失败: mqd_t mqd; mqd = mq_open("/myMq", (O_WRONLY|O_NONBLOCK)); if ((mqd_t)-1 == mqd) { printf("mq_open %d %s\n", errno, strerror(errno)); } 它给出了错误:mq_open 13权限被拒绝 我正在使用CentOS 6.5 64位 uname […]

命令检查消息队列和共享内存在Linux中的状态?

不好意思问这样一个愚蠢的问题,因为我是unix unob。 什么是unix命令来查找共享内存和消息队列以及如何杀死它们?

如何在不删除项目的情况下查看Linux(POSIX)消息队列?

我需要查看一个消息队列而不删除它们。 只要符合某些标准,我将继续并删除消息队列项目。 这个怎么做? 以下是我所知道的API – 但似乎没有支持窥视。 mq_close() – closures消息队列 mq_getattr() – 获取消息队列的当前属性 mq_notify() – 在队列变为非空时通知调用进程 mq_open() – 打开或创build一个消息队列 mq_receive() – 从队列中接收消息 mq_send() – 将消息放入消息队列中 mq_setattr() – 设置消息队列的标志 mq_unlink() – 取消链接(即删除)消息队列 有没有办法在不删除邮件的情况下偷看邮件?

这是使用消息队列的正确方法吗?

我是新来的消息队列,现在我在我的Linux服务器上使用ZeroMQ 。 我正在使用PHP编写客户端和服务器。 这主要用于处理推送通知。 我在单个I / O线程的ZMQContext实例上使用基本的REQ – REPforms通信模式,就像他们已经certificate的那样。 这是最小化的zeromqServer.php代码: include("someFile.php"); $context = new ZMQContext(1); // Socket to talk to clients $responder = new ZMQSocket($context, ZMQ::SOCKET_REP); $responder->bind("tcp://*:5555"); while (true) { $request = $responder->recv(); printf ("Received request: [%s]\n", $request); // —————————————————————– // Process push notifications here // sleep (1); // —————————————————————– // Send reply back to […]

multithreading单读写器单写FIFO队列

我需要一个队列来传递消息从一个线程(A)到另一个(B),但是我找不到一个真正做我想做的事情,因为他们通常允许添加一个项目失败,在我的情况下因为消息需要处理,所以非常致命,线程真的不能停下来等待空闲的空间。 只有线程A添加项目,只有线程B读取它们 线程A不能阻塞,但是线程B不是性能关键的,所以它可以 添加项目必须总是成功,所以队列不能有一个大小上限(系统内存不足) 如果队列是空的,线程B应该等待,直到有一个项目要处理

处理消息太慢,导致一个干扰,无响应的用户界面 – 我怎样才能使用多个线程来缓解呢?

我无法保持我的应用程序响应用户操作。 因此,我想在多个线程之间拆分消息处理。 我可以简单地创build几个线程,从它们中的同一个消息队列中读取,并且让每个消息处理哪个消息? 如果是这样,那怎么能做到呢? 如果不是的话,你能提出解决这个问题的另一种方法吗?

在控制台应用程序中挣扎着一个空的Windows消息队列

在下面的(可编译的)示例中,我试图在纯控制台应用程序中侦听Windows消息队列,以便接收有关正在连接/断开连接的USB设备的通知。 我从这里拿出了示例代码: 在C ++非GUI应用程序中检测USB插入/删除 但是,在while语句中对GetMessage的调用永远不会返回,因为Windows不会向我的队列发送任何消息。 我究竟做错了什么? 这与UIPI有什么关系? 我不经常使用MFC / WinAPI,所以请详细解答您的答案。 #define ANSI #define WIN32_LEAN_AND_MEAN #define _WIN32_WINNT 0x0501 #include <windows.h> #include <winuser.h> #include <Dbt.h> #include <string> #include <iostream> #include <stdexcept> #define HID_CLASSGUID {0x4d1e55b2, 0xf16f, 0x11cf,{ 0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30}} #define CLS_NAME "DUMMY_CLASS" #define HWND_MESSAGE ((HWND)-3) LRESULT message_handler(HWND__* hwnd, UINT uint, WPARAM wparam, […]

如何使用postThreadMessage来传递一个结构体

我想使用Windows的消息队列设施发送一个结构到另一个线程。 但是我发现postthreadmessage函数只提供了两个整数参数,lparam和wparam来传递参数。所以我决定把结构地址放在lparam中。 这是正确的方式Windows使用传递结构? 我打算使用boost :: shared_ptr在接收者线程和发送者线程中保存struct的地址。 我怀疑,当两个shared_ptrs超出范围,结构将被释放两次? 我想不出一种方法来确保分配在堆上的结构将被100%释放,任何想法?

替代TControl.Perform

TControl.Perform代码是: var Message: TMessage; begin Message.Msg := Msg; Message.WParam := WParam; Message.LParam := LParam; Message.Result := 0; if Self <> nil then WindowProc(Message); Result := Message.Result; 程序执行正在等待返回,对吗? 还有一种替代方法,可以在同一个应用程序中的另一个线程中,在TFORM队列中发布消息,而不用等待返回? 编辑 这种方法可以缓解这个问题? interface const WM_DOSTUFF = WM_APP + $001; TMyForm = class(TForm) {stuff} public {Other stuff} procedure DoMyStuff(var Msg: TMessage); message WM_DOSTUFF; {More stuff} end; var MyHandle: […]