0

を使用して、pipe_out などの名前付き posix パイプを作成します。

mkfifo $path_tmp/pipe_out

Cで開く

out_pipe = fopen(TMP_PATH "/pipe_out", "w");

fprintf コマンドを使用して書き込みます

fprintf(out_pipe,"%s",string);

fprintf の戻り値を使用して、書き込まれた量を確認し、文字列の実際の長さと比較して、完全な文字列がパイプに書き込まれたかどうかを確認できると思います。そして、(オーバー)いっぱいになった場合は、何らかの方法で一時停止し、まだ書き込まれていないものから始まる無限ループで再度書き込みを試みます...

これは詳細にどのように見えるでしょうか。また、パイプがいっぱいになったときに fprintf を自動的に停止 (一時停止) するより高度な方法があるのでしょうか。

4

1 に答える 1

0

パイプがいっぱいになったことを事前に検出する場合はfprintf()、データを内部的にバッファリングするため、使用することはお勧めできません。

パイプfdが書き込み可能でなくなった場合でも、内部バッファーもいっぱいでない限り、fprintf()は戻り続けます。その場合、短縮された値は返されませんが、文字列全体を書き込み/バッファリングできるようになるまでブロックされます。

パイプの状態を検出する場合は、バッファリングされた関数を使用しないでください。ただし、次のようにします。

  • open()でfifo/パイプを開きます
  • select()は、ファイル記述子が書き込み可能であるかどうかをテストします
  • 文字列を書き込むためのwrite()(戻り値を処理する必要があります)
于 2012-06-08T15:46:11.083 に答える