0

/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でエレガントなソリューションを持っている人はいますか?

4

0 に答える 0