UNP第二章 第三章 Posix IPC & system v IPC

最近两天将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的一种实现如下:

image

如果不利用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 第二卷 第二章和第三章

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值