Unix套接字好像是套接字和管道的混合,socketpair()可以创建一对无命名的、相互连接的Unix域套接字。 管道历史上,它们是半双工的(数据只能在一个方向上流动),但是现在也有全双工管道。...socketpair()函数的声明: #include #include int socketpair(int domain, int type..., int protocol, int sockfd[2]); socketpair()函数用于创建一对无名的、相互连接的套接字。...(AF_UNIX, SOCK_STREAM, 0, socket_pair) == -1 ) { printf(“Error, socketpair create failed, errno...gcc -o sendmsg sendmsg.c yu@ubuntu:~/Linux/217/pro_pool/socketpair .
socketpair函数概要例如以下: #include #include int socketpair(int domain, int type...sys/socket.h文件必须包括进来定义socketpair函数原型。 socketpair函数须要四个參数。...socketpair函数的选择例如以下: SOCK_STREAM SOCK_DGRAM 对于socketpair函数,protocol參数必须提供为0。 參数sv[2]是接收代表两个套接口的整数数组。...socketpair()函数创建出两个进程,fork()之后这两个进程都会运行主程序中的代码,这个一定要注意!尤其是bind的时候,假设bind两次的话,那就会出错了。...( AF_UNIX, SOCK_STREAM, 0, fd ); if ( r < 0 ) { perror( “socketpair()” );
但是上述方面比较复杂,这时候就引入要分析的socketpair了。 socketpair用于创建一对相互连接的unnamed socket。...而pipe和socketpair创建的描述符之间的区别就是: pipe创建的描述符一端只能用于读,一端用于写,而socketpair创建的描述符任意一端既可以读也可以写。 原理 ?...(AF_UNIX, SOCK_SEQPACKET, 0, sockets); if(ret == -1) { printf("socketpair create error...编译代码 gcc socketpair.c -o socketpair -lpthread 2. 运行,查看结果 test$ ....如果要实现两个进程之间的双向通信,则需要将socketpair创建的一个描述符fd发送给另一个进程,这相当于两个两个不同的进程访问同一个文件。
socketpair – a slight generalization of pipes used for two-way stream communication....以下内容来自:匠意雕码 http://my.oschina.net/zengsai/blog/12583 今天用了一个从没玩过的socket函数socketpair(),它的作用是在进程内创建一对sock...include main() { int sockets[2], child; char buf[1024]; /* Get the socket pair */ if (socketpair...(AF_UNIX, SOCK_STREAM, 0, sockets) < 0) { printf(“error %d on socketpair\n”, errno); exit(1); }
socketpair函数概要如下: #include 定义一些C宏常量 #include 定义socketpair函数原型 int...socketpair(int domain, int type, int protocol, int sv[2]); socketpair函数需要四个参数: domain-套接口的域 type...-套接口类型 protocol-使用的协议 sv[2]-指向存储文件描述符的指针 类型参数声明了我们希望创建哪种类型的套接口,socketpair函数的选择如下: SOCK_STREAM...SOCK_DGRAM 对于socketpair函数,protocol参数必须提供为0。...socketpair可以用于多进程间全双工通讯。 1.调用socketpair,成功后便有两个socket文件描述符,一个socket就像是一个pipe。
今天跟人谈到socketpair的问题,晚上回来写了个程序验证下自己的猜测!...先说说我的理解:socketpair创建了一对无名的套接字描述符(只能在AF_UNIX域中使用),描述符存储于一个二元数组,eg. s[2] .这对套接字可以进行双工通信,每一个描述符既可以读也可以写。...string = "This is a test string"; char * buf = (char*)calloc(1 , BUF_SIZE); if( socketpair...test string"; char * buf = (char*)calloc(1 , BUF_SIZE); pid_t pid; if( socketpair...在内核中实现的一点点描述: socketpair会创建两个描述符,但改描述符不属于任何的实际文件系统,而是网络文件系统,虚拟的.同时内核会将这两个描述符彼此设为自己的peer即对端(这里即解决了如何标识读写端
socketpair()函数的声明: #include #include int socketpair(int d, int type,...int protocol, int sv[2]); socketpair()函数用于创建一对无名的、相互连接的套接子。...(AF_UNIX, SOCK_STREAM, 0, socket_pair) == -1 ) { printf("Error, socketpair create failed, errno...(AF_UNIX, SOCK_STREAM, 0, socket_pair) == -1 ) { printf("Error, socketpair create failed, errno...$ gcc -o sendmsg sendmsg.c yu@ubuntu:~/Linux/217/pro_pool/socketpair$ .
socketpair用于创建一对相互连接的unnamed socket。而pipe系统调用使用创建的pipe也是相互连接的unnamed pipe(无名管道)。...而pipe和socketpair创建的描述符之间的区别就是: pipe创建的描述符一端只能用于读,一端用于写,而socketpair创建的描述符任意一端既可以读也可以写。...(AF_UNIX, SOCK_SEQPACKET, 0, sockets); if(ret == -1) { printf("socketpair create error!...编译代码 gcc socketpair.c -o socketpair -lpthread 2. 运行,查看结果 test$ ....如果要实现两个进程之间的双向通信,则需要将socketpair创建的一个描述符fd发送给另一个进程,这相当于两个两个不同的进程访问同一个文件。
所以这里引入一个新的方法,叫“socketpair” APP通过socketpair调用得到两个文件句柄,假设这两个文件句柄是fd1和fd2,这两个文件都对应有两个缓冲区(send_buf、rcv_buf...那么如果想使用socketpair来实现任意间的进程间的双向通信怎么办? 假设现在有APP1和APP2,这两个APP想进行任意间的进程通信,那么APP2需要得到APP1的fd2才行,怎么得到呢?...可以通过binder通信,把fd2传给APP2,当然在APP2里面它就变为fd3了,这样这个任意的进程APP2就可以通过socketpair来进行通信了。...这篇暂不讲解binder的实现方式 下面讲解一下“Socketpair”的程序及使用: #include <pthread.h #include <unistd.h #include <stdio.h...我们还可以修改程序,让应用程序fork出一个子进程,然后让父子进程通过socketpair来实现双向通信,比较简单,这里就不细讲了。
前言:本文介绍socketpair的实现和通信。...而socketpair虽然也类似,但它不需要地址的概念,因为它用于有继承关系的进程间通信,通常是主进程调用socketpair拿到两个fd,然后fork出子进程,这样两个进程就可以通信了,不需要寻址的过程...下面我从内核角度看看socketpair的实现。...就是申请了两份这样的数据结构,然后调用钩子函数socketpair。...再调用socketpair之前,架构如下。 ? 我们接下来看socketpair钩子函数的实现。
四、socketpair 函数 功能:创建一个全双工的流管道 原型 int socketpair(int domain, int type, int protocol, int sv[2]); 参数...domain: 协议家族 type: 套接字类型 protocol: 协议类型 sv: 返回套接字对 返回值:成功返回0;失败返回-1 实际上socketpair 函数跟pipe 函数是类似的...,也只能在同个主机上具有亲缘关系的进程间通信,但pipe 创建的匿名管道是半双工的,而socketpair 可以认为是创建一个全双工的管道。...可以使用socketpair 创建返回的套接字对进行父子进程通信: /******************************************************************.../socketpair sending data: 1 recv data : 2 sending data: 3 recv data : 4 sending data: 5 recv
在看Android 输入系统的时候,第一次看到socketpair,发现和管道非常相似。唯他们的区别就是socketpair,默认支持全双工,而pipe是半双工的。...下面分别以socketpair和管道实现全双工通信。...); sprintf(buf,"hello thread %d\n",cnt++); write(fd2[1],buf,strlen(buf)); sleep(3); } return 0; } Socketpair...sleep(3); } return NULL; } int main(int agrc,char**argv) { int fd[2]; pthread_t thread1_t; /*1. create socketpair...*/ int ret = socketpair(AF_UNIX,SOCK_STREAM,0,fd); if(ret < 0){ perror("socketpair"); exit(-1); } /*2
1.socketpair函数 先看man手册: SYNOPSIS #include /* See NOTES */ #include... int socketpair(int domain, int type, int protocol, int sv[2]); DESCRIPTION ...The socketpair() call creates an unnamed pair of connected sockets in the specified domain,...运行,需要先创建一个test.txt文件,再运行: xcy@xcy-virtual-machine:~/test/sock14_socketpair$ ....xcy@xcy-virtual-machine:~/test/sock14_socketpair$ 补充: 1)虽然文件描述符是一个整形数字,但是单纯发一个数字过去是没有用的。
socketpair函数概要如下: #include #include int socketpair(int domain, int type...sys/socket.h文件必须包含进来定义socketpair函数原型。 socketpair函数需要四个参数。...socketpair函数的选择如下: SOCK_STREAM SOCK_DGRAM 对于socketpair函数,protocol参数必须提供为0。...socketpair()函数创建出两个进程,fork()之后这两个进程都会执行主程序中的代码,这个一定要注意!尤其是bind的时候,如果bind两次的话,那就会出错了。...( AF_UNIX, SOCK_STREAM, 0, fd ); if ( r < 0 ) { perror( “socketpair()” );
前言 socketpair是Linux下的函数,其主要作用是创建一对套节字来进行进程间通信,其与匿名管道(PIPE)的作用相似,这两个套节字均可读可写....=client) closesocket(client); return -1; } static int __dgram_socketpair(struct addrinfo* addr_info,SOCKET...=server) closesocket(server); if (result) freeaddrinfo(result); return -1; } int socketpair(int family...(p_addrinfo, recv); //use for tcp else if(SOCK_DGRAM == type) result = __dgram_socketpair(p_addrinfo...= 0) { printf("Init socket dll err"); } if(socketpair(AF_INET, SOCK_STREAM, 0, recv_pair) < 0) printf
摘要 在linux下,使用socketpair函数能够创建一对套节字进行进程间通信(IPC)。...函数原形: #include #include int socketpair(int domain, int type, int protocol...相关代码 /*socketpair1.c*/ #include #include #include #include int main () { int sv[2]; int result = socketpair(AF_UNIX, SOCK_STREAM, 0, sv); if (result < 0){ exit
AF_LOCAL */ char sun_path[104]; /* null-terminated pathname */ }; 存放sun_path数组中的路径名必须以空字符结尾 2.socketpair...函数 socketpair函数建立一对相互连接的套接口,这个函数只对Unix域套接口使用。...#include int socketpair(int family, int type, int protocol, int sockfd[2]); //返回: 成功返回...指定type参数为SOCK_STREAM调用socketpair所得到的结果称为流管道(stream pipe),这和一般的Unix管道(由pipe函数生成)类似,但流管道是全双工的,即两个描述字都是可读写的
socketpair 前文提到从进程实际上通过系统调用 execvp 启动新的 Node.js 实例;也就是说默认情况下,Node.js 主从进程不会共享文件描述符表,那它们到底是如何互发消息的呢?...原来,可以利用 socketpair 创建一对全双工匿名 socket,用于在进程间互发消息;其函数签名如下: int socketpair(int domain, int type, int protocol...其实,通过指定 socketpair 的第一个参数为 AF_UNIX,表示创建匿名 UNIX 域套接字(UNIX domain socket),这样就可以使用系统函数 sendmsg 和 recvmsg...进程级文件描述符表中,0-2分别是标准输入stdin、标准输出stdout和标准错误输出stderr,那么可用的第一个文件描述符就是3,socketpair 显然会占用从进程的第一个可用文件描述符。...前文提到系统函数 socketpair 可以创建一对双向 socket,能够用来发送 JSON 消息,这一块主要涉及到流操作;另外,当 sendHandle 有值时,它们还可以用于传递文件描述符,其过程要相对复杂一些
nginx使用的是 socketpair 方法关联套接字,我们看看socketpair的原型: int socketpair(int d, int type, int protocol, int sv[...2]); 我们关注一下第四个参数,当这个socketpair函数执行成功后,就会生成一个socket对在数组中,sv[2]中的socket是关联起来的,什么意思呢?...nginx的具体的实现方式如上图所示: channel[0]和channel[0]为一对socketpair。 1. 向channel[0]写数据时,可从channel[1]读数据; 2....而nginx,只利用了第一条,即master向channel[0]写数据时,worker可从channel[1]读数据 socketpair也用来进行父子进程的通信,子进程会继承父进程的资源。...第一步,由Master进程创建socket pair,即创建channel,利用socketpair函数,master进程processes数组中存储了master与新的work的channel信息。
os.waitpid(pid, 0) # 等待子进程结束 return math.sqrt(sum(sums) * 8) print pi(10000000) 输出 3.14159262176 无名套接字socketpair...上图为单进程的socketpair ?...上图为父子进程分离后的socketpair 为了解决这个问题,Unix系统提供了无名套接字socketpair,不需要端口也可以创建套接字,父子进程通过socketpair来进行全双工通信。...socketpair返回两个套接字对象,一个用于读一个用于写,它有点类似于pipe,只不过pipe返回的是两个文件描述符,都是整数。所以写起代码形式上跟pipe几乎没有什么区别。...range(10): # 分10个子进程 mink = unit * i maxk = mink + unit rsock, wsock = socket.socketpair
领取专属 10元无门槛券
手把手带您无忧上云