多进程程序:ftok vs IPC_PRIVATE

Multiprocess program: ftok vs IPC_PRIVATE

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

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

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

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

ftok 不需要被 children 调用。 ftok 所做的只是 return 一个基于文件索引节点及其第二个参数的值的整数。 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));
}

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

Linux 手册页在 BUGS 部分中的说明与此相同:

The name choice IPC_PRIVATE was perhaps unfortunate, IPC_NEW would more clearly show its function.

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

POSIX [...] provides a simpler, and better designed interface