本文共 1898 字,大约阅读时间需要 6 分钟。
目录
IPS全称是Inter-Process Communication(进程间通信),指至少两个进程或线程间传送数据或信号的一些技术或方法。进程是计算机系统分配资源的最小单位(严格说来是线程)。每个进程都有自己的一部分独立的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。这些进程可以运行在同一台计算机上或连网的不同计算机上。
Linux中,与IPC相关的命令包括:ipcs、ipcrm。IPCS命令是Linux下显示进程间通信设施状态的工具,可以查看共享内存、信号量、消息队列的状态。
具体的用法总结如下:
# ipcs -a //显示所有的IPC设施 # ipcs -q //显示所有的消息队列 # ipcs -s //显示所有的信号量 # ipcs -m //显示所有的共享内存 # ipcs -q<-m/-s> -i id //显示IPC设施的详细信息。其中,id 对应shmid、semid、msgid等 # ipcs-q<-m/-s> -l //显示IPC设施的限制大小 # ipcs <-m/-q/-s> -c //显示IPC设施的权限关系 # ipcs <-m/-q> -p //显示最近访问过IPC设施的进程ID # ipcs <-m/-q/-s> -t //显示IPC设施的最后操作时间 # ipcs -u //显示IPC设施的当前状态ipcrm命令用于移除一个消息对象,或共享内存段,或一个信号集,同时会将与ipc对象相关联的数据也一起移除。
只有root用户,或IPC对象的创建者才能执行此操作。 具体的用法总结如下: # ipcrm -M shmkey //移除用shmkey创建的共享内存段。与其相关的共享内存段和数据结构段都将在最后一次拆离操作后删除。 # ipcrm -m shmid //移除用shmid标识的共享内存段。与其相关的共享内存段和数据结构段都将在最后一次拆离操作后删除。 # ipcrm -Q msgkey //移除用msqkey创建的消息队列和数据结构 # ipcrm -q msgid //移除用msgid标识的消息队列和数据结构 # ipcrm -S semkey //移除用semkey创建的信号和数据结构 # ipcrm -s semid //移除用semid标识的信号和数据结构System V中,主要存在下面3种IPC方式:
System V消息队列,System V信号量,System V共享内存区。 这三种类型的IPC都使用key_t值做为它们的名字。 key_t这个数据类型定义在<sys/types.h>中,通常是一个至少32位整数。 通常使用ftok()函数把一个已存在的路径名和一个整数标识符转换成一个key_t值,称为IPC键。 函数原型:#include/* Generates key for System V style IPC. */key_t ftok (const char *pathname, int proj_id); // 成功返回IPC键,失败返回-1;
参数说明:
pathname 通常是跟本应用有关的目录(必须存在并且能访问),proj_id指的是本应用所用到的IPC的一个序列号.函数说明:
两进程如在pathname和proj_id上达成一致(约定好),双方就都能够通过调用ftok函数得到同一个IPC键。根据APUE(2rd), Item518所讲,ftok的实现是组合了三个值的: --pathname所在文件系统的信息(stat结构的st_dev成员) --pathname在本文件系统内的索引节点号(stat结构的st_ino成员) --id的低序8位(不能为0) 具体如何组合的,根据系统实现而不同。例如:假设指定文件的索引节点号为65732,换算成16进制为0x0100C4,而指定的ID值为35,换算成16进制为0x23,则最后的key_t返回值为0x230100C4。注意事项:
使用ftok()需要注意的问题: --pathname指定的目录(文件)必须真实存在且调用进程可访问,否则ftok返回-1; --pathname指定的目录(文件)不能在程序运行期间删除或创建。因为文件每次创建时由系统赋予的索引节点可能不一样。这样一来,通过同一个pathname与proj_id就不能保证生成同一个IPC键。