多进程程序:ftok vs IPC_PRIVATE

时间:2016-01-27 19:18:48

标签: c multiprocess

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

当我调用fork()时,父亲和儿子都会自动共享密钥IPC_PRIVATE。正确?

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

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

1 个答案:

答案 0 :(得分:3)

ftok不需要孩子们调用。所有ftok都会根据文件的inode及其第二个参数的值返回一个整数。 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 [...]提供了一个更简单,设计更好的界面

相关问题