APUE第17章 高级进程间通讯

UNIX域套接字

背景

socket用于在因特网上传输数据,但如果要本机上进程间传递信息的话,用socket会多了协议的拆解等步骤,比较繁琐。所以出现了UNIX套接字,不需要多余的网络报头、校验和、确认报文等网络传输所需要的内容,UNIX域套接字是可靠的,不会丢失报文和出错。

无命名UNIX域套接字

1
2
3
4
5
#include <sys/socket.h>
int socketpair(int domain, int type, int protocal, int sockfd[2]); //返回0表示成功,出错返回-1
//example
int fd[2];
socketpair(AF_UNIX,SOCK_STREAM,0,fd);

无命名的域套接字是在一个进程中创建了两个fd分别用于读写,无命名的套接字意味着不能在无关进程中使用它们

命名UNIX域套接字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Linux下
struct sockaddr_un{
sa_family_t sun_family; //AF_UNIX
char sun_path[108]; //pathname
};
//FreeBSD和Mac OS X中
struct sockaddr_un{
unsigned char sun_len;//socket length
sa_family_t sun_family;
char sun_path[104];
};
/*
sun_path是路径名,用于绑定对应的UNIX域套接字
流程还是
socket(AF_UNIX,)
bind
listen
accept
*/