《UNIX网络编程 卷2:进程间通信(第2版)》——2.3 创建与打开IPC通道

本节书摘来自异步社区《UNIX网络编程 卷2:进程间通信(第2版)》一书中的第2章,第2.3节,作者:【美】W. Richard Stevens著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.3 创建与打开IPC通道

mq_open、sem_open和shm_open这三个创建或打开一个IPC对象的函数,它们的名为oflag的第二个参数指定怎样打开所请求的对象。这与标准open函数的第二个参数类似。图2-3给出了可组合构成该参数的各种常值。

《UNIX网络编程 卷2:进程间通信(第2版)》——2.3 创建与打开IPC通道

前3行指定怎样打开对象:只读、只写或读写。消息队列能以其中任何一种模式打开,信号量的打开不指定任何模式(任意信号量操作,都需要读写访问权),共享内存区对象则不能以只写模式打开。

图2-3中余下4行标志是可选的。

O_CREAT 若不存在则创建由函数第一个参数所指定名字的消息队列、信号量或共享内存区对象(同时检查O_EXCL标志,我们不久将要说明)。
创建一个新的消息队列、信号量或共享内存区对象时,至少需要另外一个称为mode的参数。该参数指定权限位,它是由图2-4中所示常值按位或形成的。

《UNIX网络编程 卷2:进程间通信(第2版)》——2.3 创建与打开IPC通道

这些常值定义在头文件中。所指定的权限位受当前进程的文件模式创建掩码(file mode creation mask)修正,而该掩码可通过调用umask函数(APUE第83~85页②)或使用shell的umask命令来设置。

跟新创建的文件一样,当创建一个新的消息队列、信号量或共享内存区对象时,其用户ID被置为当前进程的有效用户ID。信号量或共享内存区对象的组ID被置为当前进程的有效组ID或某个系统默认组ID。新消息队列对象的组ID则被置为当前进程的有效组ID(APUE第77~78页③详细讨论了用户ID和组ID。)

这三种Posix IPC类型在设置组ID上存在的差异多少有点奇怪。由open新创建的文件的组ID或者是当前进程的有效组ID,或者是该文件所在目录的组ID,但是IPC函数不能假定系统为IPC对象创建了一个在文件系统中的路径名。

O_EXCL 如果该标志和O_CREAT一起指定,那么IPC函数只在所指定名字的消息队列、信号量或共享内存区对象不存在时才创建新的对象。如果该对象已经存在,而且指定了O_CREAT|O_EXCL,那么返回一个EEXIST错误。

考虑到其他进程的存在,检查所指定名字的消息队列、信号量或共享内存区对象的存在与否和创建它(如果它不存在)这两步必须是原子的(atomic)。我们将在3.4节看到适用于SystemV IPC的两个类似标志。

O_NONBLOCK 该标志使得一个消息队列在队列为空时的读或队列填满时的写不被阻塞。我们将在5.4节随mq_receive和mq_send这两个函数详细讨论该标志。 - O_TRUNC 如果以读写模式打开了一个已存在的共享内存区对象,那么该标志将使得该对象的长度被截成0。

图2-5展示了打开一个IPC对象的真正逻辑流程。我们将在2.4节通过访问权限的测试说明该图。图2-6是展示图2-5中逻辑的另一种形式。

《UNIX网络编程 卷2:进程间通信(第2版)》——2.3 创建与打开IPC通道

注意图2-6指定了O_CREAT标志但没有指定O_EXCL标志的中间那行,我们无法得到一个指示以判别是创建了一个新对象,还是在引用一个已存在的对象。

上一篇:win8下安装wamp3.0步骤


下一篇:XAMPP下pear安装