我需要使用 /tmp 中的命名 FIFO 与进程(Kamailio SIP 服务器)通信。它的工作方式是我需要设置自己的响应 FIFO,然后将请求写入 Kamailio,Kamailio 会将响应写回我的 FIFO。
所以,我怎么理解它应该去..
- mkfifo 在 /tmp 中新建一个临时 FIFO,用于接收响应。我使用 os.getpid() 来创建一个唯一的名称,例如 /tmp/response_1234_fifo
尝试打开(fifo,“r”)FIFO并读取()它..但这将在open()中阻塞,因为还没有人打开FIFO进行写入
将请求写入众所周知的静态 FIFO(例如 /tmp/request_fifo)。此请求包含我的响应 FIFO 的名称
Kamailio 将处理请求,打开我的响应 FIFO 进行写入并 write() 对它的响应。
此时我的 open() 应该可能会解除阻塞并且 read() 会接收数据。但它似乎没有这样做。它有时有效,但有时无效。
写完响应后,Kamailio 将关闭我的响应 FIFO,这将导致下一次 read() 的 EOF
现在我可以 rm 临时响应 FIFO
在尝试以几种不同的方式执行此操作后,我的大脑已经关闭,包括线程、popen:“cat < response_fifo”,甚至尝试使用非阻塞打开和轮询..
如果我看看运行命令的 Kamailio shell 脚本是如何做到的,它是如此简单,让我哭泣 :)
cat < $response_fifo &
printf "$CMD" > $request_fifo
wait
rm $response_fifo
有人在 Python 中有一个优雅的解决方案吗?