パイプ:pipe
3564 ワード
int pipe1[2];
int r = pipe(pipe1);
assert(r==0);//
write(pipe1[1],&buffer,strlen(buffer));
read(pipe1[0],&buffer,BUF_SIZ);
close(pipe1[1]);
パイプ操作とクローズ検出のデフォルトではパイプの読み書き操作がブロックされており、パイプにデータが読めない場合、read呼び出しはデータ書き込みがあるまでブロックされ、他端日にfd[1]がオフになっている場合、readは戻ることができ、戻り値が0の場合、書き込み端がクローズされていることを示し、戻り値-1は現在のfd自体がクローズされていることを示している
void readpipe()
{
int r;
for(;;)
{
char c;
r = read(pipe1[0],&c,1);
if(r == 0)
{
printf("the write pipe is closed
");
break;
}
if(r == -1)
{
printf("the read pipe is closed
");
break;
}
printf("%c",c);
}
}
void writepipe()
{
FILE *fp = fopen("hello.txt","r");
assert(fp != NULL);
while((c=fgetc(fp))!=EOF)
{
write(pipe1[1],&c,1);
}
close(pipe1[1]);
}
パイプデータの読み込み隠しの問題:一度に何バイトのデータを読み込むべきですか?データが送信されたのはいつですか?一般的なプレゼンテーションプログラムはどうなっていますか?一度に1つの情報を書き込むと、読み取り側は最大キャッシュサイズで読み取り(一般的には書き込み側の書き込みデータの最大サイズもこのキャッシュサイズを超えることはありません)読み終わってから再びデータを書き込み、任意の時間でパイプに最大1つのデータしかありません.そして、このデータは極めて簡単で、文字列かもしれません.読み取り側が取得してprintfが出てくると実際の状況は、本当のアプリケーションでは、送信側は必ずしも一書一読の方式に従って仕事をするとは限らない.それは読み取り側がいつデータを読むかを知ることができない.読み取り側が知らない限り、このようにもっと複雑なものを引き起こす.彼らの間には通信が必要だからだ.また、送信側も毎回1つのデータだけを送信するとは限らない.一度に複数のデータを送信する可能性がある.つまり、読み取りが書き込みより遅いとき、パイプには複数のデータが蓄積されるはずだ.そのため、読み取り側はデータを識別する能力を備えなければならない.パイプから何バイトを読むかが完全な有意義なデータであり、多く読むことができない(次のデータを破壊した)ことも少なく読むことができない(データが不完全である)ことはプロトコルによって約束するしかない.もし各データがC式の文字列であれば、受信側は文字に従って読むしかなく、いったん'0'文字を読むと1つのデータが終わったと考えられる.その後読むデータは次のもの、あるいは私たちの各データの先端には1つのデータヘッダが含まれていて、データヘッダにはデータ長が記録されています.では、受信者はデータを読むたびにデータヘッダを予読し、データヘッダの情報に基づいて何バイト読むかを決定します.実際にはパイプだけではありません.どのストリーム式のデータチャネルもそうです.そのため、プロトコルを設計する必要があります.特にネットワーク通信の場合