名前付きパイプ (FIFO) を介して bash スクリプトからメッセージを受信できる C ファイルがあります。echo "abc" > /tmp/fifo
パイプの書き込み側を開閉します。したがって、私は C から繰り返しファイルを開きます。open のブロック性はfopen
、何かがパイプに書き込まれた場合にのみ戻ることを意味します。コードは次のようになります。
while (1) {
if (stat(fifo_path, &fifo_st) != 0) {
perror("FIFO does not exist, exiting\n");
exit(0)
}
fifo = fopen(fifo_path, "r");
read = fgets(buf, 1024 * sizeof(char), fifo);
私の問題は、bash スクリプトがファイルを削除して、通信が完了したことを示す可能性があることです。その場合、クリーンアップを行う必要があります。ただし、fopen
ファイルが削除されたときに返されないため (これは予想される動作だと思います)、FIFO ファイルが削除されたことを伝える方法がありません。
ファイルが削除されたことを検出してクリーンアップを行う別のスレッドを作成できると思いますが、それはオーバーエンジニアリングのようです。それを行うためのより良い方法があるかどうか知りたいですか?
編集:問題についてはここで説明していますが、「プロセスが永久にハングすることを意味します」で終わり、推奨される回避策はありません...