如何取回现有的 msg queue id

Posted

技术标签:

【中文标题】如何取回现有的 msg queue id【英文标题】:how to get back existing msg queue id 【发布时间】:2012-04-05 07:19:14 【问题描述】:

我正在使用 msgget() 系统调用来获取新的 msg 队列。我在其中使用了 IPC_CREAT 和 IPC_EXCL 标志。像 message_queue = msgget(ftok("/tmp", 100), (0666 | IPC_CREAT | IPC_EXCL)); 现在,当我的 prog 意外存在时,味精队列仍然存在,我无法重新创建味精队列。所以,我的问题是“我怎样才能取回现有的 msg 队列的 ID?”

顺便问一下,msg queue 的 id 存放在哪里?

【问题讨论】:

【参考方案1】:

Regd "我怎样才能取回现有的 msg 队列的 ID?"

来自 man msgget

   If  msgflg  specifies both IPC_CREAT and IPC_EXCL and a message queue already exists for key, then msgget() fails with errno set to EEX-
   IST.  (This is analogous to the effect of the combination O_CREAT | O_EXCL for open(2).)

尝试不带 IPC_EXCL 标志。

注册。 msg queue在哪里存储它的id

来自人的过程

   /proc/sysvipc
          Subdirectory  containing  the  pseudo-files  msg,  sem  and  shm.  These files list the System V Interprocess Communication (IPC)
          objects (respectively: message queues, semaphores, and shared memory) that currently  exist  on  the  system,  providing  similar
          information  to that available via ipcs(1).  These files have headers and are formatted (one IPC object per line) for easy under-
          standing.  svipc(7) provides further background on the information shown by these files.

【讨论】:

感谢回复 user967552。这很有帮助。【参考方案2】:

以下是尝试回答问题,如果有用,请转至The Linux Programmer’s Guide。如果它被确定为无关紧要或什么的,那么错误都是我的。

ipcs 命令可用于获取所有 System V IPC 对象的状态。

ipcs -q: Show only message queues
ipcs -s: Show only semaphores
ipcs -m: Show only shared memory
ipcs --help: Additional arguments

ipcrm 命令可用于从内核中删除 IPC 对象。而IPC 对象可以通过用户代码中的系统调用来删除(我们稍后会看到),需要 经常会出现手动删除 IPC 对象的情况,尤其是在开发环境中。

它的用法很简单:

ipcrm <msg | sem | shm> <IPC ID>

【讨论】:

【参考方案3】:

不要第二次尝试重新创建消息队列。您第二次使用IPC_CREAT | IPC_EXCL 导致msgget 失败。

来自msgget的手册页

如果 msgflg 同时指定 IPC_CREATIPC_EXCL 以及消息队列 密钥已存在,则 msgget() 失败,errno 设置为 EEXIST。 (这类似于组合 O_CREAT | O_EXCL 的效果 打开(2)。)

所以您仍然可以第二次继续使用msgget,但只能使用IPC_CREAT 标志。 还要注意检查ftokmsgget 的返回值,并将错误值(如果有)与手册页进行比较。还要检查errno

此外,如果您对现有消息队列有太多问题,您可以通过调用 msgctlIPC_RMID 标志来删除它

另外,关于 msg 队列存储位置的另一个答案。你可能想删除一个麻烦的消息队列 :) 但请注意,它们是位于虚拟文件系统 /proc 上的只读文件!

【讨论】:

@JohnG 很高兴它帮助了你,约翰! :)

以上是关于如何取回现有的 msg queue id的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式:如何在 PL/SQL 中实现负向后查找

如何使用现有的Oracle序列在hibernate中生成id?

如何使用新的 Cordova 应用程序更新我在 ios 商店中现有的移动空气应用程序

Berkeley DB:如何从 QUEUE 获取特定的 KEY

如何重塑现有的 JSON 以适应 Highcharts

如何在模式中重用现有的 HTML 元素?