Я пытаюсь использовать именованные каналы для межпроцессного общения, но я вижу странные вещи, которые я не могу понять. У меня есть этот «писатель» код: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
Вы пытались использовать 'cat'? Вы пытались запустить 'strace tail -f filename'? –
Продолжайте печатать. Введите более 4096 символов ('PIPE_BUF', обычно). Теперь что-то появляется? – zwol
Другие рекомендации: Не используйте именованные каналы для межпроцессного взаимодействия. Или если вы делаете это только в одном направлении. Локальные сокеты UNIX намного лучше подходят для двусторонней связи. Я знаю по опыту и пытаюсь создать систему, которая не потерялась бы в сорняках, если бы случайно было послано другое сообщение в трубу. –