APUE第17章 高级进程间通讯


UNIX域套接字

背景

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

无命名UNIX域套接字

#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域套接字

//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
*/