问题标签 [mqueue]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1711 浏览

c - 在 mq_unlink 之后处理 mq_open 失败

我正在使用 Posix 消息队列进行通信的 Suse Linux 上编写客户端/服务器进程,类似于“如何在基于 Linux 的系统上的 ac 程序中使用 mqueue? ”中接受的答案。当服务器死机时,它会执行mq_closemq_unlink。但是,客户端不会收到此通知,因此即使队列已取消链接,客户端中对mq_send的调用仍将继续工作。

问题是,当服务器重新启动时,它尝试使用 O_CREAT 创建一个带有mq_open的队列,但这会失败,因为客户端仍然有一个打开的 fd。因此,即使 /dev/mqueue 中的文件名似乎不存在,服务器也无法创建一个,直到客户端退出并关闭其文件描述符。我只是想确保我理解正确:如果我希望服务器关闭、取消链接并重新打开 mqueue(例如:具有不同的属性),它肯定需要客户端退出或关闭它的 fd 吗?这与处理普通文件的方式有很大不同:我可以删除另一个进程正在使用的文件,文件系统可能会将其重命名为“.nfsXXX”,他们可以继续使用它,但我可以创建一个新的立即使用该名称的文件。

我第一次尝试解决这个问题只是在服务器退出时不取消链接 mqueue - 如果我想允许重新启动服务器而不需要重新启动客户端,那么我想我不应该取消链接队列(因为服务器知道客户端可能仍在使用 mqueue,它不应该被取消链接)。

理想情况下,我希望新的mq_open在服务器中成功,而下一个mq_send在客户端中失败。有没有一种简单的方法来模拟这个?我想到的方法是:

  • 在每次mq_send之前在“/dev/mqueue/queueName”上执行 fstat(或其他东西)(糟糕!),如果名称不存在则关闭 fd(当服务器尝试在循环中重新创建它时),但即便如此如果由于队列已满,客户端当前在mq_send上被阻塞,则无法完美运行。
  • 在客户端中有一个单独的套接字,当服务器希望客户端关闭其 mqueue 时,服务器将向该套接字发送消息(并且可能在客户端中有一个单独的线程来监视该套接字)。
  • 让服务器杀死客户端。
0 投票
1 回答
536 浏览

ipc - 在系统中查找和关闭/取消链接消息队列

我有一台 SLES-11 机器,我不是在该机器上构建广泛使用消息队列的软件代码的根。由于一些错误,现在有一个错误:

mq_open: Too many open files

我正在使用该命令ipcs -a,但没有看到我的消息队列。所以我不能使用ipcrm命令。

所以,现在我根本无法使用这台机器。有没有办法在系统中找到消息队列(由我打开)并关闭它们?

信息:我的/dev/mqueue系统中没有。我也不是root用户

0 投票
1 回答
12111 浏览

c - 在 mq_send 中发送结构

我正在使用 POSIX IPC 并根据文档 - http://man7.org/linux/man-pages/man3/mq_send.3.html

mq_send() 方法只发送 char* 数据,而 mq_recv() 只接收字符数据。但是,我想向我的 msg 队列发送一个自定义结构,在接收端,我想获取该结构。

示例结构:

那么,有谁知道如何在 C 语言中实现这一点?

0 投票
1 回答
667 浏览

posix - 创建 POSIX 消息队列时,为什么名称前需要正斜杠

POSIX 消息队列要求名称前面带有“/”是否有特殊原因?

例如,如果要尝试打开一个名为“thequeue”的消息队列。我将不得不使用:

0 投票
1 回答
970 浏览

c++ - 当数据存在时,mq_receive 返回 EAGAIN

我有一个 mqueue,其中包含 2 条消息,但对 mq_receive 的调用不会提取数据。我以前对这个消息队列没有任何经验,所以请原谅我的无知。我相信发送端工作正常,因为回显“文件”确实显示了信息。

这是没有生成消息信号的 2 条消息。PID 是将调用 mq_receive 的进程。

作为参考,这里是开放代码。

这是接收。

msgSize 总是返回 -1 和 errno EAGAIN。从文档来看,这应该意味着队列中没有消息。请注意,它是非阻塞的。

0 投票
0 回答
286 浏览

c++ - mq_receive:缓冲区大小

有什么我没看到的吗?

每次涉及此功能时,我的项目都会崩溃:

SMW 是端口号(kanal),我想得到“smw”

attr.mq_msgsize = 8192

全球.h:

mmqueue.h:

0 投票
1 回答
7445 浏览

c - posix mqueue中的错误文件描述符

任何人都可以帮我解决 posix mqueue 中文件描述符错误的问题。我正在尝试读取 RAW 套接字数据包并将它们放在 mqueue 中。

我得到的输出是

main:64: 0 <= mq_send(mq, buffer, MAX_SIZE, 0): 错误的文件描述符

0 投票
1 回答
1713 浏览

c - 在 mqueue 的消息中传递结构

我正在尝试读取一个 IP/RAW 套接字数据包及其参数(例如指向 IP 数据包的字符指针及其大小),将其放入 WRONLY 模式下的 mqueue 中,并在 RDONLY 模式下从队列中检索相同的参数。我正在使用消息(msg)的结构来发送和接收。发送 msg 时,这两个参数都成功放入队列中,但在检索时返回我分段错误。我的发送和接收文件如下:

mq_send.c

mq_receive.c

mqueue_send.c 的输出:

mq_receive.c 的输出:

0 投票
1 回答
681 浏览

c - Posix 消息队列 QSIZE 查询

当我在执行 mq_send()/mq_receive() 之前和之后使用“cat /dev/mqueue/myqueue”检查消息队列的 QSIZE 时,mq_recieve() 之后似乎有一些剩余字节留在队列中。我的小测试程序如下:

我不明白为什么最初将 62 字节放入队列中,而在发送和接收 14 字节消息后留下了 48 字节的剩余部分。任何帮助将非常感激。

亲切的问候

约翰·达菲

0 投票
0 回答
83 浏览

mercurial - 如何将最新的远程更改拉入远程仓库(使用 mqueues 时)

hg book 建议在远程存储库更新时使用以下工作流程更新您的 mqueue 补丁Link

qsave命令说:

什么是新的推荐工作流程?我想做的事:

  1. 签出代码
  2. 对其进行一些提交(可能但不一定使用 mqueues)
  3. 从远程仓库拉取最新的更改
  4. 将更改集成到我的存储库中。我对变基或合并工作流程持开放态度,但是我想使用某种 3 路合并工具来解决冲突

编辑:我现在使用的工作流程是:

此工作流程的问题在于它会生成.reject文件。

我知道我也可以这样做:

这个问题是我不知道如何中止或撤消它,因为它实际上修改了我的补丁。我认为它会创建某种备份,如以下消息所述:saved backup bundle to /someDirectory/.hg/strip-backup/424323abc42a-backup.hg.


编辑

我刚刚做了一个hg pull --rebase并且效果很好......我认为这就是我将要使用的东西。我对此的主要不满是我真的更喜欢合并而不是变基。我希望能够看到我提交的真正父级以及我是如何解决冲突的。不幸的是,我不认为合并和使用 mqueues 是一个兼容的工作流程。弹出一个上面有历史的补丁可能没有意义......


编辑

再想一想,我认为这是我下次知道我将有毛茸茸的冲突时要尝试的工作流程:

我认为在理论上这样做之后,我可以像在 senario 7 中那样重新合并我的合并