分类: LINUX
2008-11-23 22:18:15
笔记: XSI IPC (SYSV IPC)
XSI IPC包含了三种通信机制:消息队列,信号量,共享内存。
1.标志符(identifiers)和键(keys)
内核中每个IPC结构都用一个非负整数加以引用,这个非负整数称为“标志符”。例如,给一个消息队列发送或者接收消息,只需要使用这个队列的标志符即可。
标志符是IPC对象的内部名称。
为了使多个合作进程能够在同一个IPC对象上会合,需要提供一个外部名称方案。键(keys)是IPC对象的外部名称。每个IPC对象与一个键相关联,这个键作为该对象的外部名称。
当创建一个IPC对象时(调用msgget,semget或者shmget),都应指定一个键。键的数据类型是key_t。键由内核变换成标志符。
客户端程序和服务器程序在同一个IPC结构上汇合的三种方式:
1>. 如果key的值被指定为IPC_PRIVATE,服务器程序会创建一个新的IPC结构,返回identifier值;服务器程序需要将这个返回值存储到某一个地方(比如一个文件内),以便让客户端程序能够获取。
IPC_RIVATE key还可以用在父子进程中。父进程通过IPC_PRIVATE创建一个新的IPC结构,返回identifier值;父进程fork()一个子进程,然后可以将identifier的值作为exec()的一个参数传给子进程。达到父子进程在同一个IPC结构上通信的目的。
2>. 客户端程序和服务器端程序可以将一个指定的key定义到一个公用的头文件中。然而,指定的key不能保证它是否已经关联到其他的IPC结构上。
3>.客户端程序和服务器端程序可以传递一个pathname和一个project ID,调用ftok()函数来产生一个key;然后将这个key值放到一个公用的头文件中。
三个get函数(msgget, semget, shmgetg)都有两个类似的参数:一个key和一个flag。一个新的IPC结构(通常,由服务器)被在以下两种情况下创建:key被指定为IPC_PRIVATE;key被指定为一个唯一值(改值没有和其他IPC结构关联),flag里的IPC_CREATE位被置位。
2. Permission Structure
每个IPC结构会关联一个 ipc_perm的数据结构。这个数据结构定义了IPC的权限访问域:
struct ipc_perm { uid_t uid; /* owner's effective user id */ gid_t gid; /* owner's effective group id */ uid_t cuid; /* creator's effective user id */ gid_t cgid; /* creator's effective group id */ mode_t mode; /* access modes */ . . . }; |
Access mode List:
Permission |
Bit |
user-read |
0400 |
user-write (alter) |
0200 |
group-read |
0040 |
group-write (alter) |
0020 |
other-read |
0004 |
other-write (alter) |
0002 |
3. Configuration Limits
ipcs -l
cat /proc/sysvipc/msg
cat /proc/sysvipc/shm
cat /proc/sysvipc/sem
cat /poc/sys/kernel/msgmax
cat /poc/sys/kernel/msgmnb
cat /poc/sys/kernel/msgmni
cat /proc/sys/kernel/shmall
cat /proc/sys/kernel/shmmax
cat /proc/sys/kernel/shmmni
ipcrm
![]() |
|