参考
socket IPC (本地套接字 domain)
socket API 原本是为网络通讯设计的,但后来在 socket 的框架上发展出一种 PC 机制,就是 UNIX Domain Socket。虽然网络 socket 也可用于同一台主机的进程间通讯 (通过 oopback 地址 127.0.0.1),但是 UNIX Domain Socket 用于IPC 更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从-个进程拷贝到另一个进程。这是因为,IPC 机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。UNIXDomain Socket 也提供面向流和面向数据包两种 API 接口,类似于 TCP 和 UDP,但是面向消息的 UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。
UNIX Domain Socket 是全双工的,API 接口语义丰富,相比其它PC 机制有明显的优越性,目前已成为使用最泛的 IPC 机制,比如 XWindow 服务器和 GUI 程序之间就是通过 UNIXDomain Socket 通讯的。
使用UNIX Domain Socket的过程和网络socket 十分相似,也要先调用socketl)创建一个socket 文件描述符,addressfamily 指定为AF_UNIX,type 可以选择 SOCK_DGRAM 或 SOCK_STREAM,protocol 参数仍然指定为0 即可。
服务端
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <stddef.h> // offsetof
#include <unistd.h>
int main()
{
int ret = -1;
// 为了避免再次启动是sock.s已经占用
unlink("sock.s");
// 创建unix流式套餐
int lfd = socket(AF_UNIX, SOCK_STREAM, 0);
// 绑定
struct sockaddr_un addr;
addr.sun_family = AF_UNIX;
// 会在运行程序目录下创建sock.s,绑定时这个文件必须不存在,否则会失败
strcpy(addr.sun_path, "sock.s");
int len = offsetof(struct sockaddr_un, sun_path) + strlen(addr.sun_path