本文共 1693 字,大约阅读时间需要 5 分钟。
在本次实践中,深入探讨了Unix域套接字的工作原理及其在进程间通信中的应用,具体涉及以下环节:
Unix域套接字(Unix domain socket, UDS)在Linux系统中提供了一种机内通信的高效手段。与网络套接字不同,UDS完全局限于同一台计算机内的进程通信,且其通信机制与文件操作相似,使得进程间的数据交互更加简便高效。
import socketserver_addr = '/tmp/server.sock'sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)sock.bind(server_addr)sock.listen(0)while True: conn, client_addr = sock.accept() data = conn.recv(100) conn.sendall(data)
import socketimport timeserver_addr = '/tmp/server.sock'sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)sock.connect(server_addr)while True: message = 'Hello World!' sock.sendall(message) time.sleep(1) sock.recv(1)
运行代码,观察到以下关键现象:
服务器进程(pid 2554):
/tmp/server.sock
,并立即进入监听状态。客户端进程(pid 2555):
内核交互分析(strace输出):
4
读取数据,调用recvfrom
进行接收,然后立即用同样描述符发送数据。3
发送数据,然后接收服务器返回的数据,每次等待一秒后继续循环。在UDS中,套接字文件/tmp/server.sock
充当唯一标识符,连接建立基于该文件和进程间的文件描述符:
服务器(server.py):
socket.bind(server_addr)
将套接字绑定到指定文件。客户端(client.py):
socket.connect(server_addr)
与服务器进行连接。通过strace
分析可见,进程在用户空间向内核空间转发数据,套接字将数据存储在内存空间中各自独立的内存段内:
setsockopt
或者改用AF_UNIX
的不同方法,如共享句柄。mMSG
功能或技巧分批次读取。通过本次实践,不仅加深了对UDS原理的理解,也掌握了进程间高效通信的实用方法。这为后续的系统设计和优化奠定了坚实基础。
转载地址:http://fuzfk.baihongyu.com/