Introduction本文为第十七篇,UnixDomainSocketsforProcessSynchronization。上一篇介绍了通过共享内存处理进程同步的问题。本文是另一种实现进程同步的方法---UnixdomainsocketUnixdomainsocketdomainsocket是进程间通信的一种高级方法Unixdomainsocket可以用于同一台机器的进程间通信。套接字(socket)最初是一个用于网络通信的术语。Unix系统提供的域套接字提供了与网络套接字类似的功能。正如我们前面所了解的,共享内存需要额外的同步机制来同步多个进程之间的通信。Unixdomainsockets不需要额外的机制来保证多进程之间的通信(事实上,我们在部署Nginx的时候,都会使用unixdomainsockets)。Unixdomainsocket使用方法左边是服务端,右边是客户端,下面是代码示例。客户端和服务器通过域套接字连接。服务器(server.cpp)#include#include#include#include#include#include#include#include#include//定义域套接字路径//使用域套接字时,会在文件系统中创建一个文件,client和server通过这个文件连接#defineSOCKET_PATH"./domainsocket"//定义消息的最大长度#defineMSG_SIZE2048intmain(){intsocket_fd,accept_fd;intret=0;socklen_taddr_len;charmsg[MSG_SIZE];结构sockaddr_un服务器地址;//1。创建域套接字socket_fd=socket(PF_UNIX,SOCK_STREAM,0);if(-1==socket_fd){std::cout<<"套接字创建失败"<ret){std::cout<<“绑定套接字失败。”<<标准::结束;返回-1;}//3。监听套接字std::cout<<"监听套接字..."<#include#include#include#include#include#include#include#include#include//Definedomainsocketpath//使用domainsocket时,会在文件系统中创建一个文件,client和server通过这个文件连接#defineSOCKET_PATH"./domainsocket"//定义消息最大长度#defineMSG_SIZE2048intmain(){intsocket_fd;intret=0;charmsg[MSG_SIZE];结构sockaddr_un服务地址;//1。创建域套接字socket_fd=socket(PF_UNIX,SOCK_STREAM,0);if(-1==socket_fd){std::cout<<"套接字创建失败"<>>";fgets(味精,MSG_SIZE,标准输入);//3。发送消息ret=send(socket_fd,msg,MSG_SIZE,0);}关闭(socket_fd);return0;}runserver.cpp运行cliet.cpp并发送消息。服务器收到消息。域套接字提供可靠的信息传输。与共享内存相比,不需要维护多个进程来读取内存空间。也就是说,域套接字比共享内存更可靠。从代码中我们可以看出,客户端与服务端通信时,不需要额外的标签来管理同步机制。使用起来更简单。总结为单机提供简单可靠的进程通信同步服务。只能在单机上使用,不能跨机使用(跨机需要使用网络套接字)在瞬息万变的技术中寻找相同点,是一个技术人的核心竞争力。知行合一,理论与实践相结合