socketpair
函数用于创建两个已经连接好的Unix域的socket
,仅用于Unix域通讯,这两个socket对应的sockaddr_un.sun_path
是空的,可用于同一个进程或父子进程之间的通信。它和pipe管道类似,区别在于,管道是半双工的,而这两个sockfd是全双工的,即每个sockfd既可以读也可以写。简单实例如下:
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <sys/un.h>
int
main(int argc, char **argv)
{
pid_t pid;
char buff[128];
int ret;
int sockfd[2];
struct sockaddr_un addr1;
int socklen;
if ((ret = socketpair(AF_LOCAL, SOCK_STREAM, 0, sockfd)) == -1) {
perror("socketpair error");
return 0;
}
socklen = sizeof(addr1);
getsockname(sockfd[0], (struct sockaddr *)&addr1, &socklen);
printf("addr1 : %s\n", addr1.sun_path);//打出来是空的
if ( (pid = fork()) == 0) {//child process
printf("in child process\n");
close(sockfd[0]);
strcpy(buff, "hello");
if ( (ret = send(sockfd[1], buff, sizeof(sockfd), 0)) < 0) {
perror("send failed");
}
return 0;
}
printf("in father process\n");
close(sockfd[1]);
if ((ret = recv(sockfd[0], buff, sizeof(buff), 0)) < 0) {
perror("recv failed");
}
printf("%s\n", buff);
return 0;
}