【问题标题】:Detecting whether a connectionless Unix Domain Socket has no receiver检测无连接的 Unix Domain Socket 是否没有接收器
【发布时间】:2015-05-06 17:49:20
【问题描述】:

我正在设计一个多进程服务器,它需要能够将连接的套接字发送到同级进程。我计划使用 unix 域套接字来执行此操作,但我不想保持打开的 O(n^2) 连接以使它们全部相互连接,所以我正在考虑使用无连接(即 SOCK_DGRAM)UDS(以避免每次连接和断开的开销)。

我担心的是如果其中一个进程崩溃并且不再在其 UDS 套接字上接收消息会发生什么?

发送者是否会阻塞,只是在内核中缓冲数据,给出一个关于问题的明确错误(没有人接收),或者别的什么?

基本上,我想问题归结为“我如何判断是否存在绑定给定 UDS 的(正在运行的)进程?”

【问题讨论】:

    标签: ipc unix-socket


    【解决方案1】:

    如果您尝试sendto 一个不存在的 AF_UNIX SOCK_DGRAM 套接字,sendto(2) 调用应该会失败并显示 ENOENT。因此,只要您检查 sendto 调用的错误返回值,并正确处理它们,一切都会好起来的。

    如果您在打开套接字的进程崩溃(并关闭它)时发送到套接字,则会出现竞争条件,这将导致消息丢失,因此您也需要注意这一点。

    【讨论】:

    • 如果目标进程绑定()UDS然后崩溃,它不会留下'socket文件'在文件系统上吗?这是否会导致内核简单地缓冲消息,并最终在该缓冲区已满时阻塞/EWOULDBLOCK?
    • 用于 AF_UNIX 套接字的路径与文件系统或任何地方的任何文件没有任何关系——它只是一个长度限制为与文件系统路径相同的最大长度的字符串。
    • 你确定吗?我见过的所有示例都使用 unlink()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2016-09-13
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多