Chinaunix首页 | 论坛 | 博客
  • 博客访问: 316668
  • 博文数量: 79
  • 博客积分: 1480
  • 博客等级: 上尉
  • 技术积分: 848
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-11 15:29
文章分类

全部博文(79)

文章存档

2012年(1)

2011年(5)

2010年(19)

2009年(54)

我的朋友

分类: C/C++

2010-09-13 10:26:29

(在进程之间传递FD)
一、STREAMS-Based Pipes(linux选项支持)
1、概述
(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之前关联到此文件的进程还是可以访问文件本来的内容
(2)undo

#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
阅读(737) | 评论(0) | 转发(0) |
0

上一篇:新升级的电脑

下一篇:Advanced IPC(2)

给主人留下些什么吧!~~