我有一个Linux C程序,用于在线程之间传递数据。 我一直在研究使用POSIX消息队列来解决此问题,因为它们不需要互斥锁/锁。

查看mq_open()调用,我必须指定权限和队列的路径。 这使我想到两个问题。

  1. 是否有用于指定文件路径的众所周知的约定? 我只是要将队列转储到与可执行文件相同的文件夹中。
  2. 在权限方面,我打算使用0600,但是我想进一步限制它以防止其他进程访问队列(我在线程之间共享数据,而不是在进程之间共享数据)。 鉴于队列“只是”一个文件,我可以将flock()与LOCK_EX一起使用来防止来自其他进程的访问吗?

提前致谢。

#1楼 票数:3 已采纳

关于问题1 ,请查看系统上mq_open的实现说明。 至少在Linux和FreeBSD上,消息队列名称必须以斜杠开头,但不得包含其他斜杠。

因此,尽管消息队列的名称看起来像路径,但它可能是也可能不是文件系统中的实际inode,具体取决于实现。 根据mq_overview(7) ,Linux将虚拟文件系统用于消息队列,该队列可以挂载或不挂载。

有鉴于此,问题2可能没有意义。 如果实际上甚至支持对/dev/mqueue中的文件进行锁定并且是否完成了所需的操作,则必须运行测试或检查内核源。

#2楼 票数:2

我不会打扰保护队列不受外部进程的影响。

由于羊群只是建议性的,不是强制性的,因此对您没有任何好处。 另外,我不确定flock是否可以在队列描述符上使用。

当然,以自己的用户身份运行服务将使其他进程无法使用模式0600访问队列。

但是,我将确保在启动时一次只能在队列中处理一项服务。 您可以使用pid锁定或d-bus来这样做。

  ask by It'sPete translate from so

未解决问题?本站智能推荐:

1回复

调整posix消息队列中的消息数量

当我试图减少POSIX消息队列中的消息数量时,它保持最大值为10.是否可以减少或增加POSIX消息队列中的消息数量? 以下代码将消息发送到POSIX消息队列。 我将最大消息(MQ_MAX_NUM_OF_MESSAGES)设置为5,但它发送10条消息 send.c
2回复

POSIX消息队列 - 重启后是否仍然存在?

在linux上,编写了一个简单的程序来创建一个POSIX消息队列,并向它发送一个msg,在进程终止后,似乎msg仍然存在。 问题是: 重启后msg仍然存在吗? 如果它存在,那么它在磁盘上,如果它将msg存储在磁盘而不是内存上,它如何保证性能。
1回复

c 中如何删除或清除 POSIX 消息队列中的所有消息?

我想从 POSIX 消息队列中删除所有消息。 我在互联网上搜索,但我没有找到任何方法,而是找到了删除消息队列本身的方法,但这不是我的情况,我实际上想清除消息队列中的所有待处理消息。 我正在阅读手册页,我在其中找到了用于控制消息队列参数的mq_setattr API。 我只是想知道如果我使用mq_s
3回复

奇怪的posix消息队列链接问题 - 有时它没有正确链接

当我构建以下代码时,它构建良好。 如果我更改代码注释掉“while”,使用相同的命令行,它不会构建(见下文) 有任何想法吗 ? 更新: 看起来像编译器版本问题,我在不同的框上构建相同的代码,并使用上述任一文件正确构建。 所以我想我需要一个不同的编译器。
2回复

为什么在POSIX中创建消息队列时出现“无法分配内存”的错误?

为什么在POSIX中创建消息队列时出现“无法分配内存”的错误?
1回复

读取 posix 消息队列时出现错误的文件描述符

存在类似的线程,但它们都没有帮助。 在 linux 下使用以下代码读取时出现错误的文件描述符错误。 在使用 O_CREAT 标志创建时,我还指定了队列属性。 任何的想法? 谢谢。
1回复

处理与消息队列的通信

我的通讯队列有问题。 在我要编写的服务器程序中,我需要在使用fork函数创建的两个进程之间进行通信。 我收到Invalid Argument错误,但不知道为什么。 这是我的简化非工作代码。 我要纠正什么才能使其正常工作? PS我什至尝试使用睡眠功能来等待子进程,但这无济于事。
2回复

消息队列-多个进程在msgqueue上发送cmd

我有一个场景,其中多个进程(p1,p2等)同时向msg Queue(cmd_msg_q)发送命令(发布)。 并且有一个接收器进程(R1),它从队列中检索msg并将适当的答复发送回另一个msg队列(response_msg_q)上的进程。 如何从接收方进程回复,以便将消息发送到该特定进