最近两天将UNP的第二章和第三章看了下,主要讲解了unix系统下两种IPC,包括POSIX的IPC和system v下的IPC,两种IPC的使用是不相同的。
POSIX下IPC主要包括三种:
posix message queue
posix semaphores
posix shared memory
sysytem v IPC包括:
system v message queue
system v semaphores
system v shared memory
在POSIX IPC中,每个IPC对象是有名称的,而且名称是一个很重要的概念,posix ipc使用ipc的名称作为ipc的标识。mq_open sem_open shm_open三个函数的第一个参数就是这个名称,这个名称不一定是在文件系统中存在的名称。
后面的看的不太懂,后面到相关章节的时候再补充吧。
要使用IPC对象,需要创建或者打开,这与文件操作类似,主要是使用mq_open、sem_open、shm_open函数操作。在创建或者打开ipc对象时需要指定操作的mode,例如O_RONLY、O_WRONLY、O_RDWR、O_CREAT、O_EXCL等,IPC对象是有一定权限的,与文件的权限类似。
posix ipc最重要的一个是ipc对象的名称,后面可能还会用到
system v ipc
sysytem v IPC包括:
system v message queue
system v semaphores
system v shared memory
system v ipc中有一个重要的类型是key_t,在msget、semget、shmget函数操作中都需要利用这个类型是参数。系统中对每个ipc对象都会有一个结构体来标识:
int msgget(key_t key, int oflag);
int semget(key_t key, int nsems, int oflag);
struct ipc_perm//该结构体在不同的系统中具体实现是不同的
{
uid_t uid;
gid_t gid;
uid_t cuid;
gid_t cgid;
mode_t mode;
ulong_t seq;
key_t key;//这个就是ipc的key
};
要想获得key_t类型,一般有两种方法:一个是利用ftok()函数调用;另外是将key设置为IPC_PRIVATE
ftok函数是利用文件名和id来产生key_t类型的。
key_t ftok(const char *pathname, int id);
在ftok的实现中一般是利用stat函数来操作的。stat pathname文件,获得该文件的信息,然后利用stat结构中st_dev、st_ino和id生成对应的key。ftok的一种实现如下:
如果不利用ftok的话,可以直接将key设置为IPC_PRIVATE,这样会保证每次创建一个ipc对象
当然创建每个system v ipc对象时会指定操作权限。与文件权限类似。
在system v ipc对象中有一个标识符重用的问题,理解的不太透彻。
另外由于system v ipc在文件系统中没有标识,所以利用ls和rm命令是无法操作这些ipc对象的,不过可以利用ipcs和ipcrm命令来查看、删除这些ipc对象
另外,ipc对象的key是全局可见的,不这个与文件描述符略有不同。即如果一个进程创建了一个ipc对象,那么其他进程也是可以根据ipc的标识直接进行访问的。例如一个服务器创建了一个ipc对象,那么client可以直接根据ipc的标识对ipc对象进行访问。
参考:
UNP 第二卷 第二章和第三章