socketpair双方管道

使用pipe只能对有血缘关系的单向管道进行通信。不过,Linux实现了一个源自BSD的socketpair调用 (3),可以实现上述在同一个文件描述符中进行读写的功能(该调用目前也是POSIX规范的一部分 (4))。该系统调用能创建一对已连接的(UNIX族)无名socket。在Linux中,完全可以把这一对socket当成pipe返回的文件描述符一样使用,唯一的区别就是这一对文件描述符中的任何一个都可读和可写。

这似乎可以是一个用来实现进程间通信管道的好方法。不过,要注意的是,为了解决我前面的提出的使用sort的应用问题,我们需要关闭子进程的标准输入通知子进程数据已经发送完毕,而后从子进程的标准输出中读取数据直到遇到EOF。使用两个单向管道的话每个管道可以单独关闭,因而不存在任何问题;而在使用双向管道时,如果不关闭管道就无法通知对端数据已经发送完毕,但关闭了管道又无法从中读取结果数据。——这一问题不解决的话,使用socketpair的设想就变得毫无意义。

时间: 2024-10-07 06:51:08

socketpair双方管道的相关文章

Nginx源码分析:3张图看懂启动及进程工作原理

编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由陈科在高可用架构群分享.转载请注明来自高可用架构公众号「ArchNotes」.   导读:很多工程师及架构师都希望了解及掌握高性能服务器开发,阅读优秀源代码是一种有效的方式,nginx 是业界知名的高性能 Web 服务器实现,如何有效的阅读及理解 nginx?本文用图解的方式帮助大家来更好的阅读及理解 nginx 关键环节的实现.   陈科,十年行业从业经验,曾在浙江电信.阿里巴巴.华为.五八同城任开发工程及架构师等职,目前负责河狸

Fpm启动机制及流程分析———详细

FPM(FastCGI Process Manager)是PHP FastCGI运行模式的一个进程管理器,从它的定义可以看出,FPM的核心功能是进程管理,那么它用来管理什么进程呢?这个问题就需要从FastCGI说起了. FastCGI是Web服务器(如:Nginx.Apache)和处理程序之间的一种通信协议,它是与Http类似的一种应用层通信协议,注意:它只是一种协议! 前面曾一再强调,PHP只是一个脚本解析器,你可以把它理解为一个普通的函数,输入是PHP脚本.输出是执行结果,假如我们想用PHP

[转] IPC之管道、FIFO、socketpair

管道和FIFO作为最初的UNIX IPC形式,现在已用得较少.SocketPair可作为全双工版本的管道,较为常用,这里简单做个笔记 管道 * 只用于有亲缘关系的进程间通信 * 单向,即半双工 (双向方法:1 使用2个管道 2 使用SocketPair) * pipe() => write()/read() FIFO (有名管道) * 可用于无亲缘关系的进程间通信 * 单向 * mkfifo() => open() => write()/read() SocketPair * 套接字(一

13.无名管道通讯编程

? 1.进程间的通信: Linux作为典型的多进程操作系统,进程与进程之间肯定需要信息交流,这就需要进程通信. 2.进程通信的目的: ????1.数据传输:一个进程需要将数据发送给另一个进程. ????2.资源共享:多个进程之间共享同样的资源. ????3.通知事件:一个进程需要向另一个/组进程发送信息,通知他们发生了某些事情. ????4.进程控制:有些进程希望完全控制另一个进程的执行,例如Debug进程.此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道他的状态改变. ? 3.通讯

Libevent学习之SocketPair实现

Libevent设计的精化之一在于把Timer事件.Signal事件和IO事件统一集成在一个Reactor中,以统一的方式去处理这三种不同的事件,更确切的说是把Timer事件和Signal事件融合到了IO多路复用机制中. Timer事件的融合相对清晰简单,其套用了Reactor和Proactor模式(如Windows上的IOCP)中处理Timer事件的经典方法,其实Libevent就是一个Reactor嘛.由于IO复用机制(如Linux下的select.epoll)允许使用一个最大等待时间(即最

socketpair和pipe的区别

http://blog.csdn.net/bingqingsuimeng/article/details/9055499 管道pipe是半双工的,pipe两次才能实现全双工,使得代码复杂.socketpair直接就可以实现全双工. socketpair对两个文件描述符中的任何一个都可读和可写,而pipe是一个读,一个写.

socketpair实现进程通信

pipe用来创建管道,但是单个管道只能单向通信,一端用于读,而另一端用于写.如果要实现进程双向通信,必须创建一对管道.具体实现忽略.而socketpair则可以用来创建双向通信的管道.取决于底层实现,打开的还是一个文件,fd[0],fd[1],管道中f[0]读端,f[1]写端. #include <sys/types.h> #include <sys/socket.h> int socketpair(int domain, int type, int protocol, int s

socketpair函数详解

我们先来看看socketpair函数的原型如下: int socketpair(int domain,int type,int protocol,int sv[]) 第一个参数表示协议族,必须为AF_LOCAL; 第二个参数表示类型,既可以是SOCK_STREAM,又可以是SOCK_DGRAM,当参数指定为SOCK_STREAM时,得到的结果称为流管道,它与一般管道的区别是留管道是全双工的,即两个描述符即可读有可写; 第三个参数只能为0: 第四个参数用于保存创建的套接字对: socketpair

socketpair

int socketpair(int domain, int type, int protocol, int sockfd[2]); //创建未命名的全双工管道 domain只能为AF_UNIX,也就是限制在本地使用 type可以是SOCK_STREAM或SOCK_DGRAM,SOCK_STREAM相当于创建了双向流管道,管道的每一端都可以write或read,并且两端的数据流对流是分开的 protocol必须是0 sockfd数组返回管道两端的socket描述符 在2.6.27的内核版本后,t