相对于无名管道而言,有名管道当然是有名字的,这样就可以使任何进程通过文件名或路径名与该管道挂钩。所以,有名管道可用于任意两进程之间的通信。
就有名管道和无名管道的实现来说,主要是在打开方式上有所不同,管道文件一旦打开(建立),以后两者对管道文件的读、写和关闭操作相同。
int open (const char *path, int flags);
那么,下面就来说一说有名管道的打开方式:
- 以 O_RDONLY 方式打开
1) 如果管道的写端已经打开,则唤醒写端进程,完成有名管道的建立,然后,读端进程和写端进程返回各自用户空间;
2) 管道的写端尚未打开
(a) 标志位 O_NONBLOCK 为1,不加等待,立即返回;
(b) 标志位 O_NONBLOCK 为 0,读端进程进入睡眠,等待写端进程打开写端以完成有名管到的建立。
2. 以 O_WRONLY 方式打开
1) 管道的读端已经打开,若当前进程是第一次打开该有名管到写端的进程,就要负责唤醒在睡眠中等待的读端进程;
2) 读端尚未打开
(a) 标志位 O_NONBLOCK 为 1,写端打开失败,释放已经分配的各种资源,返回;
(b) 标志位 O_NONBLOCK 为 0,写端进程进入睡眠,等待某个进程打开读端才能返回。
3. 以 O_RDWR 方式打开
相当于有同一进程打开了有名管道的两端,所以不需要等待,只需唤醒某个打开了写端或读端而正在睡眠中等待的进程。