2013-12-05 2 views
0

Я пытаюсь использовать именованные каналы для межпроцессного общения, но я вижу странные вещи, которые я не могу понять. У меня есть этот «писатель» код:tail -f на названной трубе ведет себя странно

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <string.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 

#define FIFO_NAME "american_maid" 

int main(void) 
{ 
    char s[300]; 
    int num, fd; 

    mknod(FIFO_NAME, S_IFIFO | 0666, 0); 

    printf("waiting for readers...\n"); 
    fd = open(FIFO_NAME, O_WRONLY); 
     printf ("FD = %d", fd); 
        printf("got a reader--type some stuff\n"); 
    while (gets(s), !feof(stdin)) { 
     if ((num = write(fd, s, strlen(s))) == -1) 
      perror("write"); 
     else 
      printf("speak: wrote %d bytes\n", num); 
    } 

    return 0; 
} 

Теперь, когда я «хвост -f american_maid» хвостовые блоки ждет писателя. Затем я запустил код записи, и он обнаружил, что хвост -f ждет на другом конце трубы. Все идет нормально. Когда я ввожу что-либо в приложение-писатель, ничто не появляется в окне хвоста, ОДНАКО, как только я закрываю (Ctrl-C) приложение-писатель, все, что я набрал, появляется в окне хвоста.

Как будто писатель должен закрыть, прежде чем хвост может что-то показать. Любые идеи, что происходит и почему это происходит, и как я могу это исправить?

Thanks

+0

Вы пытались использовать 'cat'? Вы пытались запустить 'strace tail -f filename'? –

+1

Продолжайте печатать. Введите более 4096 символов ('PIPE_BUF', обычно). Теперь что-то появляется? – zwol

+0

Другие рекомендации: Не используйте именованные каналы для межпроцессного взаимодействия. Или если вы делаете это только в одном направлении. Локальные сокеты UNIX намного лучше подходят для двусторонней связи. Я знаю по опыту и пытаюсь создать систему, которая не потерялась бы в сорняках, если бы случайно было послано другое сообщение в трубу. –

ответ

0

Здесь нет ничего плохого. tail хочет извлечь последние линии. Чтобы определить, что это такое, он ищет конец файла в fifo, который он видит только после того, как автор закрыл конец записи fifo.

+0

Это было бы правильно для 'tail' в нормальном режиме, но' tail -f' отличается. – zwol

+0

@ Zack: можете ли вы предоставить доказательства для этого? – user2719058

+0

'strace' и посмотреть сами. – zwol