我正在使用msgget()系统调用来获取新的消息队列。 我已经使用了IPC_CREAT&IPC_EXCL标志。 例如message_queue = msgget(ftok("/tmp",100),(0666 | IPC_CREAT | IPC_EXCL)); 现在,当我的编程存在意外,味精队列仍然存在,我无法重新创build味精队列。 所以,我的问题是“我怎样才能找回现有的msg队列的ID?
顺便说一下,味精队列在哪里存储它的ID?
Arch Linux ARM编译ros-indigo-qt-gui-cpp时出现的问题
打开文件对话框和内存泄漏
C#通知单
tar(在Windows上)c#中的文件列表
Regd“我怎样才能找回现有的msg队列的ID?
从男人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标志。
REGd中。 msg队列在哪里存储它的id
从人类proc
/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 @R_905_4045@ion 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 @R_905_4045@ion shown by these files.
以下是试图回答这个问题,如果这个问题有用的话,应该参考“Linux程序员指南” 。 如果被认定为无关紧要的话,那么错误就是我的。
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>
不要尝试第二次重新创建消息队列。 您使用IPC_CREAT | IPC_EXCL 第二次IPC_CREAT | IPC_EXCL导致msgget失败。
从msgget的手册页
如果msgflg同时指定IPC_CREAT和IPC_EXCL,并且密钥已经存在消息队列,则msgget ()会失败,并将errno设置为EEXIST 。 (这与O_CREAT | O_EXCL for open (2)的组合效果类似。)
所以你仍然可以继续使用msgget第二次,但只使用IPC_CREAT标志。 同时也要检查ftok和msgget的返回值,并将错误值(如果有的话)与手册页进行比较。 另外检查errno 。
另外,如果你对现有的消息队列有太多的麻烦,你可以通过调用msgctl以及IPC_RMID标志来删除它
此外,另一个关于msg队列存储位置的答案。 你很可能会试图删除一个令人不安的消息队列:)但是请记住,它们只是读取虚拟文件系统/ proc上的文件!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。