Возникли проблемы с настройкой Unix FIFO для правильной работы? - PullRequest
1 голос
/ 11 июля 2010

Я пытаюсь написать простой демон в Linux, который создаст FIFO, затем соберет все, что записано в FIFO, и запишет эти данные в файл позднее.

Я ожидаю, чтокак только мой демон создал FIFO, я могу сделать «echo text> / myfifo» несколько раз.Когда я закончу, я могу сделать «echo quit> / myfifo», и моя программа завершит работу и запишет все данные на диск.

В настоящее время я использую poll (), чтобы узнать, когда на диске больше данных.FIFO.Это работает нормально, пока после первого раза я не отправлю данные в FIFO.Данные выводятся нормально, но мой опрос непрерывно возвращает SIGHUP после этого.

Нужно ли переустанавливать (или закрывать и открывать) FIFO после каждой записи в него процесса?

Псевдокодмоего кода выглядит так:

ret = fifo(my_fifo, mode);
fd = open(my_fifo, O_RDONLY | O_NONBLOCK);

polling.fd = fd;
polling.events = POLLIN | POLLPRI;

do {
    ret = poll(&polling, 1, -1);
    amt = read(fd, buf, bufsize);
    // do stuff
} while (!done);

1 Ответ

2 голосов
/ 11 июля 2010

Вы должны продолжать открывать FIFO, я думаю.У меня есть программа, которая контролирует FIFO, и цикл монитора:

/* Implement monitor mode */
void sql_monitor(char *fifo)
{
    if (chk_fifo(fifo) != 0)
        cmd_error(E_NOTFIFO, fifo);

    /* Monitor -- device is assumed to be a FIFO */
    while (1)
    {
        ctxt_newcontext();
        if (ctxt_setinput(fifo) != 0)
            sql_exit(1);
        sql_file();
        ctxt_endcontext();
    }
}

Функция ctxt_newcontext() сохраняет текущее состояние ввода / вывода;функция ctxt_setinput() устанавливает входной файл для именованного файла - в данном случае FIFO.Функция sql_file() читает из файла (FIFO), пока не будет достигнут конец - файл закрыт.ctxt_endcontext() отменяет то, что делает ctxt_newcontext().Процесс повторяется ... Этот код существует примерно с 1990 года.

Итак, ДА , вам нужно будет продолжать закрывать и снова открывать FIFO после чтения конца файла (послекаждый процесс, такой как echo, завершает запись в FIFO).

(Вы также должны заметить, что на самом деле нет необходимости опрашивать FIFO, если нет процесса, который нужно выполнить, когда естьнет данных. read() вызов будет ждать, пока не будет данных, прежде чем вернуться.)

...