fprintf () для stdout не работает после создания и открытия FIFO - PullRequest
0 голосов
/ 06 мая 2019

Когда моя программа запускается, она просто создает fifo и открывает ее, после чего я просто хочу вывести некоторую информацию на экран, однако ничего не выводится на печать.Вот фрагмент моего кода:

void listen(const server_config_t* server_conf)
{
    // Create FIFO
    if (mkfifo(SERVER_FIFO_PATH, 0660) == -1) {
        fprintf(stdout, "server FIFO not created as it already exists. continuing...\n");
    }

    // Open FIFO (for reading)
    int fd;
    if ((fd = open(SERVER_FIFO_PATH, O_RDONLY)) == -1) {
        // fprintf(stderr, "error: could not open server FIFO\n");
        perror("FIFO");
        exit(1);
    }

    // Open dummy FIFO (for writing, prevent busy waiting)
    // TODO: find way to wait without another file descriptor?
    int fd_dummy;
    if ((fd_dummy = open(SERVER_FIFO_PATH, O_WRONLY)) == -1) {
        perror("DUMMY FIFO");
        exit(1);
    }

    // TODO: this should print immediately after starting,
    //       but doesn't for some reason
    fprintf(stdout, "server listening... %d %s\n", server_conf->num_threads,
        server_conf->password);
    fflush(stdout);

.
.
.

}

Вот мой вывод:

Here's the output

Я пытался закомментировать создание fifoи открытие, и когда я это сделаю, сообщение будет правильно выведено на экран.

Ответы [ 2 ]

5 голосов
/ 06 мая 2019

Как правило, открытие FIFO блокируется до тех пор, пока не откроется другой конец, см. http://man7.org/linux/man-pages/man7/fifo.7.html. Таким образом, ваша программа, вероятно, ожидает open(SERVER_FIFO_PATH, O_RDONLY) и не достигает других fprintf или perror.

Ваша попытка открыть FIFO сначала для чтения, а затем для записи не работает, потому что первое открытие не возвращается.

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

Кстати: когда mkfifo возвращает -1, вам следует проверить, является ли errno EEXIST.Могут быть и другие ошибки, которые также приведут к возвращаемому значению -1, см. https://linux.die.net/man/3/mkfifo

2 голосов
/ 06 мая 2019

Как видно из вашего вывода, есть блокировка.То есть ваш текущий процесс не может продолжаться, пока другой конец FIFO не будет открыт для write.Вы должны взглянуть на справочную страницу .

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

#include <string.h>
#include <stdlib.h>
..
..
fprintf(stderr, "server FIFO not created as it already exists. Error: %s\n", strerror(errno));
exit(EXIT_FAILURE);
...