gpt4 book ai didi

c - 访问IPC_PRIVATE生成的key_t

转载 作者:行者123 更新时间:2023-11-30 16:18:43 26 4
gpt4 key购买 nike

我正在尝试同步并使一些线程/进程为项目进行通信,并且理想情况下我希望访问它们之间的一些共享内存块,而不会让它们与其他进程/资源发生冲突。

我知道 IPC_PRIVATE 在调用 shmget() 创建它时会生成一个唯一的 key ,但是如果我随后需要该 key 在其他进程中的某个位置打开该区域,我如何访问生成的key_t 值以便我可以将其发送到其他进程?

我目前正在通过 IPC 消息队列发送数据,因此我可以发送 shmid 值,但据我所知,这不起作用,因为 shmid 值对于每个进程都是唯一的。

我没有其他选择,只能尝试 ftok() 和一些随机文件吗?我是否必须为我想要创建的不同共享内存的每个 block 选择不同的文件?

感谢您的宝贵时间。

最佳答案

I know IPC_PRIVATE will generate a unique key when calling shmget() to create it

不,你误会了。 IPC_PRIVATE不会生成 key_t ,它 key_t 。这个特价key_t引发 shmget() 的特殊行为总是创建一个新段,忽略除模式位之外的所有标志位。

if I then need that key to open that region somewhere in other processes, how can I access that generated key_t value so that I can send it to the other process?

因为您总是会获得一个带有 IPC_PRIVATE 的新 segmentation ,您不能通过每个进程通过该键独立获取共享内存段来在进程之间共享内存。相反,对于通过这样的段进行通信的两个或多个进程,(2021-12-19 插入)它们可能会交换其中一个从 shmget() 获取的 shmid。 ,或者它们必须都可以从创建它的共同祖先进程(或者创建它的进程)继承它。彼此之间没有这种关系的进程不能使用 IPC_PRIVATE访问同一段的 key 。

Do I have no other options but try luck with ftok() and some random files? Do I have to choose a different file for each block of different shared memory I wish to create?

由于您使用的是 System-V 共享内存,因此您可以选择使用 ftok()基于现有路径生成 key ,但它不必是任意文件。您可以使用具有特定协作进程组特征的文件路径——输入文件、工作目录或类似文件。此外,ftok()还使用整数“项目 ID”,您可以使用它来区分不相关的运行,或用于不同目的或类似目的的多个不同键。如果你没有其他好的方法来区分,你可以在那里选择一些指定进程的进程id。

请注意,顺便说一下,System-V IPC 接口(interface)非常笨重。它们确实有一些显着的特征,有时可能会使它们更受欢迎,但较新的 POSIX 接口(interface)( shm_open() 等)通常是更好的选择。然而,POSIX 版本并没有为您所询问的问题提供特别更好的解决方案。

关于c - 访问IPC_PRIVATE生成的key_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55833470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com