/tmp の名前付き FIFO を使用して、プロセス (Kamailio SIP サーバー) と通信する必要があります。それが機能する方法は、私自身の応答 FIFO を設定し、応答を FIFO に書き戻す Kamailio に要求を書き込む必要があるということです。
それで、私はそれがどのように進むべきかを理解しています..
- mkfifo は、応答を受信するための /tmp 内の新しい一時 FIFO です。os.getpid() を使用して、/tmp/response_1234_fifo などの一意の名前を作成します
FIFO を open(fifo, "r") して read() しようとしますが、書き込み用に FIFO を開いている人がまだいないため、これは open() でブロックされます。
既知の静的 FIFO に要求を書き込みます (たとえば、/tmp/request_fifo)。このリクエストには、レスポンス FIFO の名前が含まれています
Kamailio はリクエストを処理し、書き込み用にレスポンス FIFO を開き、それに対するレスポンスを write() します。
この時点で、open() はおそらくブロックを解除し、read() はデータを受け取るはずです。しかし、そうではないようです。うまくいくこともありますが、うまくいかないこともあります。
応答を書き込んだ後、Kamailio は応答 FIFO を閉じます。これにより、次の read() の EOF が発生します。
これで、一時応答 FIFO を rm できるようになりました
スレッド化、「cat < response_fifo」の popen:ing、さらにはノンブロッキングの open と polling を使用しようとするなど、いくつかの異なる方法でこれを実行しようとした後、私の脳はシャットダウンしました..
コマンドを実行するための Kamailio シェル スクリプトがどのようにそれを実行するかを見ると、とてもシンプルで泣けてきます :)
cat < $response_fifo &
printf "$CMD" > $request_fifo
wait
rm $response_fifo
Pythonでエレガントなソリューションを持っている人はいますか?