关于ftok

    key_t ftok(const char *path, int id);

    根据pathname指定的文件(或目录)名称,以及proj_id参数指定的数字,ftok函数为IPC对象生成一个唯一性的键值。在实际应用中,很容易产生的一个理解是,在proj_id相同的情况下,只要文件(或目录)名称不变,就可以确保ftok返回始终一致的键值。

   然而,这个理解并非完全正确,有可能给应用开发埋下很隐晦的陷阱。因为ftok的实现存在这样的风险,即在访问同一共享内存的多个进程先后调用ftok函数的时间段中,如果pathname指定的文件(或目录)被删除且重新创建,则文件系统会赋予这个同名文件(或目录)新的i节点信息,于是这些进程所调用的ftok虽然都能正常返回,但得到的键值却并不能保证相同。由此可能造成的后果是,原本这些进程意图访问一个相同的共享内存对象,然而由于它们各自得到的键值不同,实际上进程指向的共享内存不再一致;如果这些共享内存都得到创建,则在整个应用运行的过程中表面上不会报出任何错误,然而通过一个共享内存对象进行数据传输的目的将无法实现。

 

     此外,因为i节点号和键通常都存放在长整型中,于是创建键时可能丢失信息,他们都是长整型,通过一个长整数(i节点)和一个整数id,构造另外一个长整数(键),目标长整数中不可能包含所有的输入信息,会丢弃一部分的。这意味着,如果使用同一项目ID,那么对于不同文件的两个路径名可能产生相同的键

你可能感兴趣的:(Path)