簡単なプログラムがあります。
int main () {
int fd;
int i, rc;
i = 0;
rc = mkfifo ("fff", 0);
fd = open ("fff", O_WRONLY);
fprintf(stdout,"open fifo fff succeeded\n"); fflush (stdout);
while (i<8)
{
rc = write (fd, "abcdefg", 8);
fprintf(stdout,"write to 'fff' returned with rc=%d\n",rc); fflush (stdout);
i++;
}
close (fd);
return 0;
}
Unbuntu 16.04、Linux myserv 4.4.0-81-generic #104-Ubuntu SMP で実行し、次の結果を得ました。
open fifo fff succeeded
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
write to 'fff' returned with rc=-1
開くと書き込みの両方が非ブロックであり、それを読み取るために開いているプロセスがないことを示します。 Linuxのマニュアルページによると、
。 。 。ただし、入力または出力操作を実行するには、まず両端が開いている必要があります。読み取りのために FIFO を開くと、通常、他のプロセスが書き込みのために同じ FIFO を開くまでブロックされ、その逆も同様です。
紛争を経験しているようです。私が逃したものはありますか?これについての説明を楽しみにしています。また、FIFOの「書き込みブロック」の実装に関する提案はありますか?
ベストアンサー1
ルール#1:実行するすべての作業を理解するには、マニュアルページをお読みください。
ルール#2:疑わしい場合は実行してくださいls -la
。
ルール#3:プログラムをデバッグするときは、すべての変数を印刷してください。
ルール#3a:実際に成功したことを最初に確認せずに成功したと宣言しないでください。
2番目のパラメータmkfifo
はモデル。モード(権限)が0のFIFOを生成しています p---------
。したがって、open
EACCESS エラーが原因で失敗し、-1
EINVAL エラーが原因でfd
ファイル記述子への書き込みが失敗します。-1