C语言 多进程程序:ftok vs IPC_PRIVATE



我对ftok()和IPC_PRIVATE生成的密钥有些怀疑。

当我调用fork()时,密钥IPC_PRIVATE自动由父子共享。右?

当我调用fork()时,ftok(...,...)获得的密钥必须由创建的每个进程重新计算。是这样吗?

当我调用execl()时,我只能使用ftok()创建的密钥,而不能使用IPC_PRIVATE密钥。右?

ftok不需要被孩子们调用。 ftok所做的只是根据文件的索引节点及其第二个参数的值返回一个整数。 ftok 为不相关的进程提供了一种查找相同 IPC 资源的简单方法。 这是 musl-1.1.12 ftok.c 的实现(它比 glibc 版本更容易阅读)。

#include <sys/ipc.h>
#include <sys/stat.h>
key_t ftok(const char *path, int id)
{
        struct stat st;
        if (stat(path, &st) < 0) return -1;
        return ((st.st_ino & 0xffff) | ((st.st_dev & 0xff) << 16) | ((id & 0xff) << 24));
}

提供给 msgget(2)、semget(2) 或 shmget(2) IPC_PRIVATE意味着应该创建一个新的 IPC 资源。 资源不是"私有"的,只是新创建的。

Linux 手册页在 BUGS 部分也说了同样的话:

IPC_PRIVATE的名字选择也许是不幸的,IPC_NEW会 更清楚地显示其功能。

查看 POSIX IPC 接口:mq_overview(7)、sem_overview(7) 和 shm_overview(7)。 引用手册页:

POSIX [...] 提供了一个更简单,设计更好的界面

最新更新