Необходимо закрыть linux FIFO на стороне чтения после каждого сообщения - PullRequest
0 голосов
/ 16 января 2019

Вот что я сделал, и это работает:

псевдокод на стороне сервера (читатель)

mkfifo()
while (true){
    open()
    select(...NULL)
    while (select... timeval(0)) {
        read()
    }
    close()
}

реальный код C на стороне клиента (писатель)

int fd;
char * myfifo = "/tmp/saveterm.fifo";
char *msg = "MESSAGE";
fd = open(myfifo, O_WRONLY);
write(fd, msg, strlen(msg));
close(fd);

Теперь вы видите, что мне нужно открывать / закрывать fifo на сервере после каждого прочитанного события.Это должно быть так?Сначала я открывал его только один раз перед циклом, но после первого сообщения вызов select никогда больше не блокировался до закрытия и повторного открытия и всегда возвращал 1 и ISSET для дескриптора.

1 Ответ

0 голосов
/ 17 января 2019

Да, это должно быть так.

Именованные каналы ведут себя так же, как и анонимные каналы: они оба представляют один поток, который завершается, когда его закрывает последний создатель. В частности, считыватель не должен зависать вечно на случай, если какая-то будущая программа решит открыть канал и продолжить запись.

Если вы хотите использовать пакетную связь через файл, как насчет использования сокета Unix в режиме датаграмм?

...