全部博文(298)
分类: LINUX
2011-04-05 00:02:44
三.信号
信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。由于前面已经介绍,这里就不再说了。
四.XSI IPC
下面的三种进程间通信方式,即消息队列,信号量以及共享内存,它们之间有很多相似之处。我们统一称它们为XSI IPC,下面我们先介绍它们的相似之处。
1.标识符和键
每个XSI IPC都用一个非负整数的标识符(identifier)加以引用。例如,为了对一个消息队列发送或取消消息,只须知道其队列标识符。与文件标识符不同,IPC标识符不是小的整数。当一个IPC结构被创建,以后又被删除,与这种结构相关的标识符连续加1,直至达到一个整数的最大正值,然后又回转到0。
标识符是IPC对象的内部名。为使多个合作进程能够在同一IPC对象上会合,需要提供一个外部名方案。为此使用了键(key),每个IPC对象都与一个键相关联,于是键就用为该对象的外部名。
无论何时创建IPC结构,都应指定一个键,键的数据类型是基本系统数据类型key_t,通常在头文件
我们用ftok函数创建一个键。
1.
名称:: |
ftok |
功能: |
创建一个键 |
头文件: |
#include # include |
函数原形: |
key_t ftok(const char *path,int id); |
参数: |
path id |
返回值: |
若成功返回键,若出错返回(key_t)-1 |
path函数必须引用一个现存文件。当产生键时,只使用id参数的低8位。
注意:
1)pathname一定要在系统中存在
2)pathname一定是使用进程能够访问的
3)proj_id是一个1-255之间的一个整数值,典型的值是一个ASCII值。
2.权限结构
XSI IPC 为每一个IPC结构设置了一个ipc_perm结构。该结构规定了权限和所有者。
struct ipc_perm
{ ushort uid; /*当前用户*/
ushort gid; /*当前进程组*/
ushort cuid; /*创建用户*/
ushort cgid; /*创建进程组*/
ushort mode; /*存取许可权*/
{ short pid1; long pad2;} /*由系统使用*/
}
其中mode权限位设置如下表
权限 |
位 |
用户读 用户写 |
0400 0200 |
组读 组写 |
0040 0020 |
其他读 其他写 |
0004 0002 |
在创建XSI IPC结构时,对所有字段都赋初值。可以调用msgctl、semctl或shmctl修改uid,gid和mode字段。我们一会介绍这些函数。