#include <sys/types.h>
#include <sys/ipc.h>
//函数ftok把一个已存在的路径名和一个整数标识符转换成一个key_t值,称为IPC健
//该函数把从 pathname导出的信息与id的低序8位组合成一个整数IPC键
key_t ftok(const char *pathname, int proj_id);
-
System V IPC的某个给定应用来说,客户和服务器同意使用对该应用有一定意义的 pathname。它可以是服务器守护程序的路径名、服务器使用的某个公共数据文件的路径名或者系统上的某个其他路径名。如果客户和服务器之间只需单个IPC通道,那么可以使用譬如说值为1的id。如果需要多个IPC通道,譬如说从客户到服务器一个通道,从服务器到客户又ー个通道,那么作为一个例子,一个通道可使用值为1的id,另一个通道可使用值为2的id,客户和服务器一旦在 pathname和id上达成一致,双方就都能调用fok函数把 pathname和id转换成同一个IPC键值 。
-
ftok的典型实现调用stat函数,然后组合以下三个值:
(1) pathname所在的文件系统的信息(stat结构的st_dev成员)。
(2)该文件在本文件系统内的索引节点号(stat结构的st_ino成员)。
(3)id的低序8位(不能为0)。 -
注意:如果 pathname不存在,或者对于调用进程不可访问,ftok就返回-1。
-
注意:路径名用于产生键的文件不能是在服务器存活期间由服务器反复创建并删除的文件,因为该文件每次创建时由系统赋予的索引节点号很可能不一样,于是对下一个调用者来说,由ftok返回的键也可能不同。
示例:
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
struct stat stat1;
if (argc != 2) {
printf("err: argc\n");
exit(1);
}
stat(argv[1], &stat1);
key_t key = ftok(argv[1], 0x12);
if (-1 == key) {
printf("key err \n");
exit(1);
}
printf("st_dev:%lx st_ino:%lx key:%x\n", stat1.st_dev, stat1.st_ino, key);
exit(0);
}
- 从结果可以看出,id占key的高8位,st_dev的低8位占key的中间8位,st_ino的低16位占key的低16位