(在进程之间传递FD)
一、STREAMS-Based Pipes(linux选项支持)
(1)全双工
(2)图(把PIPE此图的每一根线都改成双箭头即可表达STREAM-Based Pipes)
(3)从内部看
每一个WQ(write queue)都指向一个RQ(read queue)
如果我们把一个STREAM模块push到任何一端,如图所示,这样可以把数据写入PIPE,但不能从另一端POP或者移除模块
(4)linux下用socketpair模拟是s_pipe
int s_pipe(int fd[2]) { return(socketpair(AF_UNIX, SOCK_STREAM, 0, fd)); }
|
2、Naming STREAMS Pipes
(1)pipe一般只能用于相关(比如父子)进程;不相关的进程可以用FIFO通讯,但只是半双工的; 而STREAMS机制提供了一种方式,让pipe在文件系统里有一个名字,绕过了这个问题。
(2)给STREAMS pipe在文件系统里提供一个名字
#include <stropts.h>
int fattach(int filedes, const char *path);
Returns: 0 if OK, -1 on error
|
path必须refer to一个已经存在的文件
[注]一旦pipe attach到文件,此文件原来的内容将不可访问,访问此文件即访问pipe,但attach之前关联到此文件的进程还是可以访问文件本来的内容
#include <stropts.h>
int fdetach(const char *path);
Returns: 0 if OK, -1 on error
|
fdetach之后,可以正确访问文件本来的内容,已经通过PATH访问STREAM PIPE的进程会继续访问STREAM
3、Unique Connections
(1)client进程永不会从已打开的PIPE端接受到fd,而是OS创建1个新的PIPE,返回PIPE的一端给Client进程,使其看起来像正在打开/tmp/pipe;而OS把PIPE的另一端发送给server,通过在已attach的PIPE传递server的FD,从而在client和server之间建立1个唯一的连接
(2)模拟面向连接的socket函数,在unrelated进程之间创建unique连接
#include "apue.h"
int serv_listen(const char *name);
Returns: file descriptor to listen on if OK, negative value on error
int serv_accept(int listenfd, uid_t *uidptr);
Returns: new file descriptor if OK, negative value on error
int cli_conn(const char *name);
Returns: file descriptor if OK, negative value on error
|
serv_listen():创建1个endpoint来监听连接请求
serv_accept():等待一个client连接到达,并accept
cli_conn():创建一个client endpoint并连接到server
阅读(731) | 评论(0) | 转发(0) |