2016-05-09 1 views
0

Я пытаюсь читать из fifo, и я не понимаю его поведения. Это сторона записи, write.c:Чтение из fifo C

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

И это сторона чтения, read.c:

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

Сначала я начать read.c ./read тогда я выполнить ./write Если я execute write like this ./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); 

Вы цикл, каждый раз через петлю вы перезаписать буфер, а затем печати буфера. Поэтому иногда вы читаете «резервное копирование», за которым следует «example1.txtexample2.txt» (который перезаписывает «резервную копию»), в другое время вы читаете всю партию сразу в одном чтении.

Если изменить цикл для чтения в безлюдной части буфера, он будет вести себя последовательно:

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

Но почему иногда резервная копия одна, а иногда строки находятся в одной строке? –

Смежные вопросы