问题标签 [sysv-ipc]

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 投票
1 回答
2542 浏览

cygwin - 在 Cygwin 下使用 System V 信号量:错误的系统调用

我在 Cygwin 下遇到了 POSIX Semaphores 的问题,我尝试了以下方法:

上面的 semtool 尝试创建(通过 semget、semctl 等系统调用)一个新的信号量。但是它不起作用:错误的系统调用。

此外,使用 semget() 的简约测试 C 程序也无法输出相同的消息:系统调用错误。

我已经完成了谷歌搜索:安装了 cygserver,将环境变量 CYGWIN 定义为“服务器”,但没有任何帮助。我的 cygwin 版本非常新:

任何想法/提示可能仍然缺少什么?

现在尝试使用额外的导出:

服务正在运行

没有更多错误:

似乎现在可以工作了!

0 投票
2 回答
3984 浏览

c - 在进程之间同步消息队列

我正在尝试实现一个具有生产者和 N (N >= 1) 工人的程序。他们使用消息队列进行通信。这个想法是生产者向队列发送“任务”。工作人员执行 msgrcv() 调用以获取任务并执行一些代码。在工作人员完成任务后,它会将计算结果发送到队列。生产者将收到此消息并保存结果。

我正在使用 POSIX 消息队列,并且生产者和工作人员同时工作。

该程序背后的问题是存在破坏通信的场景。每条消息的大小约为 5000 字节。在 UNIX 系统中,最大队列大小约为 16000 字节,就是这种情况。

场景是:队列中有3个任务(5000*3 = 15000字节)。一些工作人员从队列中获取一条消息(现在队列有 10000 个字节)。工作人员开始执行任务,并且由于工作人员必须在每个任务中处理的字节数,生产者向队列发送另一条消息(队列现在已满)。现在,任务完成后,工作人员尝试将结果发送到队列并被阻塞(队列已满)。生产者尝试将另一个任务发送到队列并且也被阻塞。

如果我只用一个工人运行这个程序,这种情况很有可能发生。

有没有人有避免这种情况的想法?

0 投票
5 回答
11167 浏览

c - Linux的消息队列有什么缺点?

我正在研究一个消息队列,用于在嵌入式 Linux 上的进程之间进行通信。我想知道为什么我不使用 Linux 提供的消息队列,如下所示:

msgctl、msgget、msgrcv、msgsnd。

而不是创建共享内存,并与信号量同步?

直接在商业嵌入式产品上使用这组功能有什么缺点?

0 投票
3 回答
7894 浏览

c - 从消息队列中读取(如果为空则非阻塞)

我正在写消息队列

和阅读

但是如果这个队列是空的呢?如何检查?如果没有什么我想在循环中执行下一条指令

0 投票
3 回答
7825 浏览

c - OpenWRT中需要为IPC消息队列增加缓冲区

我只是在学习如何使用消息队列,我对它们有点困难。我正在使用两个完全独立的应用程序进行测试——一个是“发送者”,另一个是“接收者”。

当我运行发件人时,它会向管道发送 15 个字符串,但随后失败并出现“资源暂时不可用”错误。我只需要在接收方消费消息,但为什么只有 15 条消息?我可能会发送大量消息,因此我想将其增加到更大的数字,例如 1000 条左右。

我尝试将消息队列大小设置为 32767,所以我期望至少为 31,但显然msg_qbytes与可以缓冲的消息数量无关。

发件人代码如下所示:

接收器代码如下所示:

0 投票
1 回答
1005 浏览

c - 有没有办法将 EOF 发送到读取消息队列的进程?

我有一个进程通过消息队列发送数据msgsnd。另一个进程从队列中读取msgrcv. 读取过程需要等到它拥有所有消息才能继续。我如何告诉它所有消息都已发送?

我一直这样做的方式是在发件人发送完所有消息之后,它会在一个while循环中检查队列中的消息数量。当没有更多消息时,它会关闭队列。

这告诉阅读过程继续做其他事情。不过,这似乎不太可靠。很多时候,发送进程会陷入检查队列状态的无限循环。

有没有办法让我只发送一条 EOF 消息并让阅读过程注意这一点?然后我可以发送 EOF 并退出发送进程。

0 投票
2 回答
2551 浏览

c - 将字符串转换为 key_t

如何将字符串转换为key_t, 以便使用它来创建共享内存段shmget

这是因为映射共享内存的密钥是通过 TCP/IP 传输的。

提前致谢!

0 投票
1 回答
477 浏览

ipc - 如何在 Mac 沙盒中启用 ipc-sysv-sem?

我需要在 Mac 应用程序中使用 IPC System V 信号量 (ipc-sysv-sem)。但是,Mac 沙盒不允许使用它们。我获得(在 mac 控制台中):

现在有人如何在 Mac 沙盒应用程序中接受 IPC System V 信号量吗?

非常感谢!

0 投票
1 回答
1577 浏览

c - System V 信号量倍增/减量

我正在阅读 POSIX 和 System V 信号量之间的区别,并且我阅读了一些相同的文章。在每篇文章中都写着这样的声明:“如果您需要在一个步骤中实现具有多个增量 - 减量的原子操作,那么 System V 信号量是有益的。”

我的问题是:

1)在单个原子操作中需要多次递增/递减吗?你能举个例子解释一下吗?

2)为什么semop允许将值更改为小于-1且大于+1的值?是否有任何实际用法/示例?

(我知道使用 System V 信号量中的 semop() 函数,我可以使信号量增加或减少一个指定值,而不是信号量数组中的一个信号量,并且不能使用 sem_wait() 或 sem_post() POSIX 信号量。但是相同的有什么用?)

我看过的文章,供大家参考:

1) http://www.ibm.com/developerworks/library/l-semaphore/

2) System V 和 Posix 信号量的区别

3) http://www.linuxdevcenter.com/pub/a/linux/2007/05/24/semaphores-in-linux.html?page=4

4) http://linuxtips.pbworks.com/w/page/29023300/SystemV%20vs%20Posix%20IPC

更新:

我已经阅读了以下文章,其中提到了使用 semop() 对信号量进行多次递增/递减,但我仍然无法获得相同的示例/实际用法。供您参考的文章:

1) http://kaharris.org/teaching/51081/Assignments/Final/systemV.pdf

文章摘录:(标题为“多信号量操作示例”下)

“System V 信号量的强大之处在于,它们可用于在一次操作中自动检查和设置多个信号量。”

他也给出了如何做到这一点的一小部分。但没有实际用法。

2) http://www.anirudhtom.com/2011/02/system-v-semaphores-for-babies.html

作者在题为“IMPLEMENTING A SET OF SEMAPHORE”下编写了一个原子操作中信号量的多次递增/递减的代码。这里也没有提到它的实际用法。

3) http://books.google.co.in/books?id=-Mq5ve5KHXQC&pg=PA109&lpg=PA109&dq=system+v+semaphore+multiple&source=bl&ots=SsdKqyG-Kp&sig=Y7AGqHrsOWaOk8EvCX2dH2RqEnA&hl=en&sa=X&ei=RVOMGBQ-pIIuEuwSV0 #v=onepage&q=system%20v%20semaphore%20multiple&f=false

书中的一段摘录:

“在 UNIX System V 中,信号量机制做了一些调整,保留了操作的原子性。但是操作的加减值可以大于一。(为什么?有什么用?)。而且,进程可以做多个信号量当多个进程同时竞争多个不同的资源时,同时操作以避免死锁问题。(如何?示例?)“

我希望这能让问题更清楚。

如果您对所提出的问题有任何疑问,请发表评论。

提前致谢!

0 投票
1 回答
883 浏览

c - 等效于 posix 信号量的 Sys V SEM_UNDO

在具有多个进程的 Linux 系统中,系统 V 信号量允许使用 SEM_UNDO 选项,以防止在持有信号量的进程崩溃时使信号量“卡住”。防止 POSIX 信号量因持有信号量的进程崩溃而被卡住的正确方法是什么?或者 POSIX 是否保证在崩溃的情况下释放信号量?