mkfifo()
私はgccをコンパイラとして使用し、Ubuntu 18および16環境でC言語で名前付きパイプを作成していますopen()
。私が気づいたことの1つは、プロセスが終了した後も名前付きパイプがファイルシステムに残っていることです。while(1)
私の要件のために、私のプロセスは無限ループで実行されるプロセスであり、終了する唯一の方法はctrl-cまたはkill
Linuxのコマンドです。これらのケースを正しく処理するためにctrl-c信号を追加することもできますが、これは問題ではありません。
名前付きパイプがファイルシステム(たとえば/tmp/named_pipe1
)に残っている場合は、名前付きパイプがファイルシステムにあることを確認し、プロセスの起動時にファイルを削除する必要があります(ファイルがシステムに残っているため)。ファイルがファイルシステムに残っていてもバッファも削除されるため、重複しているため、新しいFIFOのように使用できますか?これは、最後のコードの実行を終了して新しいコードを開始するためにctrl-cを押したときにfifoバッファを混在させたくないためです。コードを再起動すると空のバッファが必要です。
メモ:システムはプロセス間で再起動されません。プロセスを再実行するだけです。
よろしくお願いします。
答え1
FIFOを破壊するために最初の関数呼び出しを実行します。通話が失敗してもまったく問題ありません。次に呼び出しますmkfifo()
(返り値を確認して、操作が成功したことを確認します。
最初の呼び出しにはunlink()
次の構文があります。
#include <unistd.h>
int unlink(const char *pathname);
MANページの説明は次のとおりです。
unlink() ファイルシステムから名前を削除します。その名前がファイルへの最後のリンクであり、そのファイルが開いているプロセスがない場合、ファイルは削除され、そのファイルが使用するスペースを再利用できるようになります。
その名前がファイルへの最後のリンクであるがプロセスでまだファイルが開いている場合、そのファイルを参照する最後のファイル記述子が閉じられるまでファイルはそのまま残ります。
名前がシンボリックリンクを参照している場合、リンクは削除されます。
名前がソケット、FIFO、またはデバイスを参照している場合、その名前は削除されますが、オブジェクトを開くプロセスはその名前を引き続き使用できます。
戻り値 成功した場合、0 が返されます。エラーが発生すると -1 が返され、errno が適切に設定されます。
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
*説明 mkfifo() は pathname という FIFO 特殊ファイルを生成します。モードは FIFO の権限を指定します。通常の方法でプロセスのumaskによって修正されます。生成されたファイルの権限は(mode&〜umask)です。
FIFO 特殊ファイルは異なって生成される点を除けばパイプに似ています。匿名通信チャネルの代わりにmkfifo()を呼び出して、FIFO特殊ファイルがファイルシステムに入力されます。
このようにして FIFO 特殊ファイルが作成されると、すべてのプロセスで通常のファイルのように読み書きするためにそのファイルを開くことができます。ただし、入力または出力操作を実行するには、まず両端が開いている必要があります。読み取りのために FIFO を開くと、通常、他のプロセスが書き込みのために同じ FIFO を開くまでブロックされ、その逆も同様です。 FIFO特殊ファイルの非ブロック化処理については、fifo(7)を参照してください。 *
戻り値 mkfifo() および mkfifoat() は、成功すると 0 を返します。エラーが発生すると、-1が返されます(この場合はerrnoが適切に設定されます)。