生产者通过 unix 域套接字连接到消费者

生产者通过 unix 域套接字连接到消费者

我有这个:

producer-client | consumer-server

消费者启动一个 TCP 服务器来监听 unix 域套接字(类似的东西),并且客户端(生产者)将连接到它。

然而,显然存在竞争条件 - 现在我只有大约 500 毫秒的超时时间来等待消费者启动并开始侦听连接。我的问题是 - 有什么活动我可以听吗?我想我可以在超时后轮询并测试连接。是否有一些同步实用程序可以用来轮询以查看该 unix 域套接字上是否有某些内容正在侦听?

更新#1

因此,在消费者中,我删除/取消链接该文件,然后开始侦听它在生产者中,如果该文件不存在,我将创建该文件,然后用于inotify侦听对其进行的更改,一旦发生更改,我就知道了消费者中的服务器现在正在监听。

答案1

如果 和producer-client不是consumer-server通过管道而是通过套接字进行通信,则不应在管道中运行它们。

所以与其,

consumer-server &
sleep 2
producer-client &

wait

这会将服务器作为后台作业启动,等待两秒钟让服务器初始化所有内容,然后也将客户端作为后台作业启动。然后脚本等待两者终止。

正如您自己所建议的,客户端也可能只是等待套接字文件的出现,这里不使用inotify

consumer-server &

while [ ! -S /path/to/socket ]; do
    echo Waiting for socket to appear... >&2
    sleep 1
done
producer-client &

wait

循环while(或等效的事物)也可能是内部正在做的事情的一部分producer-client


如果服务器和客户端没有通过管道进行通信,那么您的管道

producer-client | consumer-server

本质上是一样的

producer-client &
consumer-server

我建议的命令集(上面)对此进行了修改,以在两者的调用之间插入短暂的延迟,并且还将客户端作为后台任务运行(这并不是绝对必要的)。

相关内容