一、Posix IPC
Posix函数汇总
创建、打开、删除、控制、操作
二、System V IPC
SYSTEM IPC 和posix 有共同的三种IPC :消息队列、信号量、共享内存
1、IPC键---key_t键和ftok函数
(1)System V IPC使用key_t值作为他们的名字,通常是一个至少32位的整数;
(2)key_t ftok(const char * pathname, int id);
(3)函数把pathname导出的信息和id的低8位组合成一个整数IPC
(4)ftok实际是调用stat函数,然后组合三个值:①、pathname在文件系统中的信息(stat结构中的st_dev) ②、(stat结构中的st_ino) ③id的低八位,但是i不能位0
{
struct stat status;
stat(argv[1], &status);
printf("st_dev: %lx, st_ino:%lx, key: %x\n", stat.st_dev, stat.st_ino, ftok(argv[1]), 0x57));
exit(0);
}
(5)ipc_perm 结构
每一个消息队列内核维护一个定义在sys/msg.h头文件的结构体中;内核给每一个IPC对象维护一个信息结构体,其内容和内核给文件维护的信息类似;
struct{
uid_t uid;
gid_t gid;
uid_t cuid;
gid_t ugid;
mode_t mode;//读写权限
ulong_t seq;
ket_t key;//IPC_key
}
(6)创建ipc通道
创或者打开IPC对象都是通过int XXXget(key_t key, int oflag)的形式创建的,认识oflag:IPC_CREAT IPC_EXCL
oflag == IPC_CREAT,------>只负责根据给出的信息创建,不检查是否存在-------------》后续可以 | 上9 (rwxrwxrwx) 个权限
oflag == IPC_CREAT | IPC_EXCL ---------->根据key来创建,如果已经存在返回错误-------------》后续可以 | 上9个权限
oflag == IPC_EXCL 没有意义-------------》后续可以 | 上9个权限
oflag == 无特殊标志,也可以创建,只需要检查key值-------------》后续可以 | 上权限
key == IPC_PRIVATE 创建一个唯一的IPC对象,(如果系统中的对象数目满了就错误)
大多数情况服务器会用前两种,客户端则不关心其中的任何标志
(7)调用xxxget函数之后
内核会为返回的fd创建一个ipc_perm 结构,权限信息存放在mode_t mode;//读写权限
0400 MSG_R SEM_R SHM_R 用户读权限
0200 MSG_W SEM_A SHM_W 用户写权限
0040 MSG_R >> 3 SEM_R >> 3 SHM_R >> 3
0020 MSG_W >> 3 ...
0004 MSG_R >> 6 SEM_R >> 6 SHM_R >> 6
0002 MSG_W >> 6 ...
(这一块需要好好补充)
(8)ipcs和ipcrm命令
由于不是用文件系统中路径名标识的,所以不能通过ls和rm查看;可以通过ipcs和ipcrm命令
_