博客
关于我
linux一切皆文件之Unix domain socket描述符(二)
阅读量:790 次
发布时间:2023-02-02

本文共 1693 字,大约阅读时间需要 5 分钟。

Unix域套接字(UDS)实践与分析

在本次实践中,深入探讨了Unix域套接字的工作原理及其在进程间通信中的应用,具体涉及以下环节:

一、入门认识

Unix域套接字(Unix domain socket, UDS)在Linux系统中提供了一种机内通信的高效手段。与网络套接字不同,UDS完全局限于同一台计算机内的进程通信,且其通信机制与文件操作相似,使得进程间的数据交互更加简便高效。

二、代码实践

1. 服务器端文件(server.py)

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)

2. 客户端文件(client.py)

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)

3. 旅程见闻

运行代码,观察到以下关键现象:

  • 服务器进程(pid 2554)

    • 打开套接字文件/tmp/server.sock,并立即进入监听状态。
    • 每次接收客户端连接请求后,创建新的文件描述符(如fd 4)来处理数据传输。
  • 客户端进程(pid 2555)

    • 与服务器成功连接,打开用于通信的文件描述符(如fd 3)。
    • 定时发送“Hello World!”数据,与服务器进行互动。
  • 内核交互分析(strace输出)

    • 服务器(server.py)
      • 使用描述符4读取数据,调用recvfrom进行接收,然后立即用同样描述符发送数据。
    • 客户端(client.py)
      • 使用描述符3发送数据,然后接收服务器返回的数据,每次等待一秒后继续循环。
  • 三、深入剖析

    1. 协议与结构

    在UDS中,套接字文件/tmp/server.sock充当唯一标识符,连接建立基于该文件和进程间的文件描述符:

    • 服务器(server.py)

      • 通过socket.bind(server_addr)将套接字绑定到指定文件。
      • 进入监听状态,等待客户端的连接请求。
      • 每次接入后,使用同一套接字进行数据交换,确保非阻塞通信。
    • 客户端(client.py)

      • 通过socket.connect(server_addr)与服务器进行连接。
      • 定期发送数据至服务器,并接收返回信息,保持通信流程。

    2. 内核与用户空间交互

    通过strace分析可见,进程在用户空间向内核空间转发数据,套接字将数据存储在内存空间中各自独立的内存段内:

    • 服务器和客户端各持有一块内存段,通过描述符表示。
    • 数据在内核空间通过套接字结构体传输,回传至客户端。

    3. 优势与特点

    • 高效性:无需网络协议,直接使用内存进行数据传输,带来低延迟。
    • 简易性:操作与标准文件操作类似,便于开发和调试。
    • 版内局限性:通信仅限同机,适用于内部需求,XB fairness。

    四、小结与调整

  • 针对资源占用问题(多次连接导致文件数目增加),建议使用setsockopt或者改用AF_UNIX的不同方法,如共享句柄。
  • 为提高发送效率,需使用mMSG功能或技巧分批次读取。
  • 建议探索第三方库(如ZEROMQ)增强性能,自动管理连接等功能。
  • 通过本次实践,不仅加深了对UDS原理的理解,也掌握了进程间高效通信的实用方法。这为后续的系统设计和优化奠定了坚实基础。

    转载地址:http://fuzfk.baihongyu.com/

    你可能感兴趣的文章
    linux 中的.so和.a文件
    查看>>
    Linux 中的密码生成器:如何在命令行中生成随机密码
    查看>>
    Linux 中的机器学习:Whisper——自动语音识别系统
    查看>>
    Linux 中的管道(Pipeline)和使用场景
    查看>>
    Linux 中的绝对路径与相对路径:有什么区别?
    查看>>
    Linux 中的逻辑卷 LVM 管理完整初学者指南
    查看>>
    Linux 使用ab进行压力测试
    查看>>
    Linux 使用记1 fastx toolkit安装问题
    查看>>
    Linux 内存优化性能实战
    查看>>
    Linux 内核 6.11 RC6 发布!
    查看>>
    Linux 内核/sbin/hotplug 工具
    查看>>
    Linux 内核kobject 缺省属性
    查看>>
    Linux 内核交互图
    查看>>
    linux 内核定时器精度_LWN 文章合集之 “内核定时器”
    查看>>
    Linux 内核有soft rdma吗?
    查看>>
    Linux 内核突破 4000 万行代码:创新与挑战并存的里程碑
    查看>>
    Linux 几种文件传输方式
    查看>>
    Linux 创建用户和工作组
    查看>>
    Linux 创建(删除)连接命令 ln -s 软连接
    查看>>
    Linux 利用lsof命令恢复删除的文件
    查看>>