socketpair的使用
Linux实现了一个源自BSD的socketpair
调用,可以实现在同一个文件描述符中进行读写的功能。
该系统调用能创建一对已连接的UNIX族socket。
在Linux中,完全可以把这一对socket当成pipe返回的文件描述符一样使用,唯一的区别就是这一对文件描述符中的任何一个都可读和可写,函数原型如下:
#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sv[2]);
socketpair()
函数建立一对匿名的已经连接的套接字,其特性由协议族d、类型type、协议protocol决定,建立的两个套接字描述符会放在sv[0]和sv[1]中。
socketpair函数参数说明:
第1个参数domain
,表示协议族,只能为AF_LOCAL
或者AF_UNIX
。
第2个参数type
,表示协议,可以是SOCK_STREAM
或者SOCK_DGRAM
。用SOCK_STREAM
建立的套接字对是管道流,与一般的管道相区别的是,套接字对建立的通道是双向的,即每一端都可以进行读写。
第3个参数protocol
,表示类型,只能为0。
第4个参数sv[2]是接收代表两个套接口的整数数组。每一个文件描述符代表一个套接口,并且与另一个并没有区别。
函数返回值:
如果函数成功,将会返回0值。否则将会返回-1表明创建失败,并且errno来表明特定的错误号。
以下给出个简单的例子,通过socketpair
实现父子间进程通信:
/*socketpair1.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <stdio.h>
int main ()
{
int fd[2];
int r = socketpair(AF_UNIX, SOCK_STREAM, 0, fd);
if (r < 0){
perror( "socketpair()" );
exit(1);
}
if (fork()){ /* 父进程 */
int val = 0;
close(fd[1]);
while (1){
sleep(1);
++val;
printf("发送数据: %d\n", val);
write(fd[0], &