【问题标题】:Get message queue ID from Key provided从提供的 Key 获取消息队列 ID
【发布时间】:2016-07-26 14:00:04
【问题描述】:

我有一个消息队列进程间通信的密钥,比如key_t = 10。 如果消息队列已经存在且键值为 10,我想获取队列 ID。 目前我正在使用下面的代码来查找队列是否存在使用返回错误

msgget((key_t)10,IPC_EXCL|IPC_CREAT|0777)

但我想获取队列 ID 并需要关闭它。

【问题讨论】:

    标签: c linux unix ipc


    【解决方案1】:

    您可以使用msgget 而不使用IPC_EXCL 标志来获取现有的消息队列标识符。

    mid = msgget((key_t)10, 0);
    

    然后,使用该标识符,您可以使用带有IPC_RMID 标志的msgctl 删除消息队列。

    编辑:

    key_t ftok(char *pathname, char proj_id);
    

    【讨论】:

    • 非常感谢@sat。如何为我的消息队列生成唯一的“key_t”,因为如果有人使用“key_t=10”,那么就会发生冲突吗?
    • @BhavithCAcharya,您可以使用ftok 生成唯一的System V IPC key
    • 谢谢@sat。我还有其他问题,但看起来很傻,请帮帮我。如果我使用 key_t ftok("tmp/mykey", 'b');生成密钥后,我正在杀死我的进程,以便消息队列仍然存在于我的内核中。所以我正在使用 vi /tmp/mykey 打开 /tmp/mykey 但密钥不可见但在 ipcs -q 命令中可见
    • @BhavithCAcharya,我想你误解了ftok 的用法。 ftok 不会将任何 key 存储到给定的文件路径中。但是,它将使用这些信息来生成唯一的消息队列密钥。阅读有关ftok 和用法的更多信息。如需key,需自行存储。
    • 很高兴它对你有用。单击投票箭头下方左侧的勾号(复选标记)以接受答案(meta.stackoverflow.com/questions/251078/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 2015-09-17
    相关资源
    最近更新 更多