|
消息队列 |
信号灯 |
共享内存区 |
头文件 |
|
|
|
创建或打开IPC函数 |
msgget |
semget |
shmget |
控制IPC操作的函数 |
msgctl |
semctl |
shmctl |
IPC操作函数 |
msgsnd msgrcv |
semop |
shmat shmdt |
ftok(把一个已存在的路径名和一个整数标识符转换成IPC键值) |
所需头文件 |
#include #include |
函数说明 |
把从pathname导出的信息与id的低序8位组合成一个整数IPC键 |
函数原型 |
key_t ftok(const char *pathname, int proj_id) |
函数传入值 |
pathname:指定的文件,此文件必须存在且可存取 |
proj_id:计划代号(project ID) |
|
函数返回值 |
成功:返回key_t值(即IPC 键值) |
出错:-1,错误原因存于error中 |
|
附加说明 |
key_t一般为32位的int型的重定义 |
#include
#include
#include
#include
#include
#include
int main(int argc, char **argv)
{
struct stat stat1 ;
if ( argc != 2 )
{
printf("usage: ftok < pathname >" ) ;
exit(1) ;
}
stat( argv[1], &stat1 ) ;
printf("st_dev:%lx, st_ino:%lx, key:%x\n", \
(unsigned long)stat1.st_dev, (unsigned long)stat1.st_ino , ftok(argv[1],0x579 )) ;
printf("st_dev:%lx, st_ino:%lx, key:%x\n", \
(unsigned long)stat1.st_dev, (unsigned long)stat1.st_ino , ftok(argv[1],0x118 )) ;
printf("st_dev:%lx, st_ino:%lx, key:%x\n", \
(unsigned long)stat1.st_dev, (unsigned long)stat1.st_ino , ftok(argv[1],0x22 )) ;
printf("st_dev:%lx, st_ino:%lx, key:%x\n", \
(unsigned long)stat1.st_dev, (unsigned long)stat1.st_ino , ftok(argv[1],0x33 )) ;
exit(0) ;
}
编译 gcc ftok.c –o ftok
st_dev:801, st_ino:4db21, key:7901db21
st_dev:801, st_ino:4db21, key:1801db21
st_dev:801, st_ino:4db21, key:2201db21
st_dev:801, st_ino:4db21, key:3301db21
st_dev:801, st_ino:4db21, key:4401db21
从上面程序可以看出,通过ftok返回的是根据文件(pathname)信息和计划编号(proj_id)合成的IPC key键值,从而避免用户使用key值的冲突。proj_id值的意义让一个文件也能生成多个IPC key键值。ftok利用同一文件最多可得到IPC key键值0xff(即256)个,因为ftok只取proj_id值二进制的后8位,即16进制的后两位与文件信息合成IPC key键值。
struct ipc_perm {
key_t key ; /* 此IPC对象的key键 */
uid_t uid ; /* 此IPC对象用户ID */
gid_t gid ; /* 此IPC对象组ID */
uid_t cuid ; /* IPC对象创建进程的有效用户ID */
gid_t cgid ; /* IPC对象创建进程的有效组ID */
mode_t mode ; /* 此IPC的读写权限 */
ulong_t seq ; /* IPC对象的序列号 */
} ;
表15-2列出了ipc_perm中mode的含义,其含义与文件访问权限相似。当调用IPC对象创建函数(semget、msgget、shmget)时,会对ipc_perm结构变量的每一个成员赋值,其中mode的值来源于IPC对象创建函数最右边的形参flag(msgget中为msgflg、semget中为semflg、shmget中shmflg)。如需修改这几个成员变量则需调用相应的控制函数(msgctl、semctl、shmctl)。
ipc_perm中mode的含义 |
|||
操作者 |
读 |
写 |
可读可写 |
用户 |
0400 |
0200 |
0600 |
组 |
0040 |
0020 |
0060 |
其他 |
0004 |
0002 |
0006 |
#define IPC_CREAT 01000 /* Create key if key does not exist. */
#define IPC_EXCL 02000 /* Fail if key exists. */
综上所述,flag标志由两部分组成,一为IPC对象存取权限(含义同ipc_perm中的mode),一为IPC对象创建模式标志(IPC_CREAT、IPC_EXCL),两者进行|运算合成IPC对象创建权限。
flag创建模式标志 |
不存在 |
已存在 |
无特殊标志 |
出错,errno=ENOENT |
成功,引用已存在对象 |
IPC_CREAT |
成功,创建新对象 |
成功,引用已存在对象 |
IPC_CREAT|IPC_EXCL |
成功,创建新对象 |
出错,errno=EEXIST |