2016-05-09 8 views
0

私はFIFOからの読み込みを試みており、その動作を理解していません。 これは、書き込み側、write.cです:私は./read read.c開始私なら、私は./write を実行fifoからの読み込みC

char buf[1024]; 
    while(1){ 
    int b = read(fifoFd,buf,1024); 
    if(b<=0) break; 
    } 
    printf("%s\n",buf); 

まず:read.c、

for(int i = 1;i<argc;i++){ 
    if(write(fifoFd,argv[i],strlen(argv[i])) <= 0) 
     perror("Error writing"); 
    } 

そして、これは読み込み側でありますこのような書き込みを実行./write backup *.txt時々私は、私が期待したものを得る、すなわち、backupexample1.txtexample2.txt。 しかし、時々私はexample1.txtexample2.txtを得て、私はこれを理解していない、 "バックアップ"はどこですか?

+0

は[MCVE]を参照 – KevinDTimm

答えて

3

あなたのコード:あなたがバッファを印刷

while(1){ 
    int b = read(fifoFd,buf,1024); 
    if(b<=0) break; 
} 
printf("%s\n",buf); 

あなたのループ、ループを通るたびに、あなたはその後、バッファ、およびを上書きします。だから、時々、 "backup"と "example1.txtexample2.txt"(これは "backup"を上書きします)を読んでいます。あなたは、バッファの未実装部分に読み取るためにループを変更する場合は

、それは一貫して動作します:

int read = 0; 
while(read != 1024){ 
    int b = read(fifoFd,buf+read,1024-read); 
    if(b<=0) break; 
    read += b; 
} 
printf("%s\n",buf); 
+0

しかし、文字列が同じラインで常に書かれるべきではありませんしてください? –

+0

@P_Ferreiraすべての文字列を書き込むのではなく、最後に受け取った文字列だけを書きます。 'printf'コールはループが完了した後*です。 – davmac

+0

しかし、なぜバックアップが単独で行われ、時には文字列が同じ行にあることがありますか? –

関連する問題