0

我需要使用 /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 中有一个优雅的解决方案吗?

4

0 回答 0