Posix消息队列,Posix信号量和Posix共享内存区合称为Posix IPC
px_ipc_name() 函数可以为定位Posix IPC名字而加上正确的目录
#### 创建与打开IPC通道:
说明 | mq_open | sem_open | shm_open |
只读 只写 读写 | O_RDONLY | O_RDONLY | |
若不存在则创建 | O_CREAT | O_CREAT O_EXCL | O_CREAT O_EXCL |
非阻塞模式 若已存在则截断 | O_NONBLOCK | |
上表是打开或者创建Posix IPC对象所用的各种oflag的值
前3行指定怎么打开对象:只读只写或者是读写,消息队列能够以任何一种模式打开,信号量的打开不指定模式( 任何信号量的读写都需要读写访问权限 ),共享内存区对象则不能以只写模式打开
以下4行是可选的:
O_CREAT:若不存在则创建由函数的第一个参数所指明的消息队列,信号量或者共享内存区对象
O_EXCL:如果和O_CREAT一起指定,那么IPC函数只在指定名字的对象不存在时才会创建,否则返回EEXIST错误
O_NONBLOCK:该标志使得消息队列在队列为空时的读或者队列填满时的写不被阻塞
O_TRUNC:若以读写模式打开了一个已存在的共享内存区对象,该标识使得该对象的长度被截为0
检查对象是否已存在-》是 -》O_CREAT和O_EXCL同时设置 ?error(errno = EEXIST) :(有访问权限?成功:errno=EACCES)
对象不存在-》O_CREAT设置了 ? (系统表格满?errno=ENOSPC:成功创建):errno=ENOENT
#### 大多数的Unix内核按如下步骤进行权限测试
1)当前进程的有效用户是超级用户(UID=0),允许访问
2)当前进程的有效用户ID=IPC对象的属主ID的前提下,若相应的用户权限位已设置,那就允许访问,否则不允许
3)当前进程的有效组ID=该IPC对象的组ID的前提下,若相应权限位已设置,允许访问,否则不允许
4)其它用户的访问权限位若已设置,允许访问,否则不允许
打开一个Posix IPC对象时,怎么判断是创建了一个新的对象还是引用了一个已有的对象?