我对ftok()和IPC_PRIVATE生成的密钥有些怀疑。
当我调用fork()时,密钥IPC_PRIVATE将自动由父和子共享。对吗?
当我调用fork()时,ftok(…,…)获得的密钥必须由创建的每个进程重新计算。是这样吗?
当我调用exec()时,我只能使用ftok()创建的密钥,而不能使用IPC_PRIVATE密钥。对吗?

最佳答案

孩子们不需要调用ftok。ftok所做的只是根据文件索引节点及其第二个参数的值返回一个整数。ftok为无关进程提供了一种简单的方法来查找相同的IPC资源。下面是musl-1.1.12ftok.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_概述(7)、sem_概述(7)和shm_概述(7)。引用手册页:
POSIX[…]提供了一个更简单、设计更好的接口

关于c - 多进程程序:ftok与IPC_PRIVATE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35046146/

10-08 21:42