Пример использования FIFO на Си

Модератор: Модераторы разделов

Аватара пользователя
GRS
Сообщения: 236
Статус: C++ Pro
ОС: Suse10.2/XP

Пример использования FIFO на Си

Сообщение GRS »

В книге Робачевского есть пример юза fifo, так вот у меня пробелемы с сервером - он не работает.

Код: Выделить всё

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>

char * FIFO_NAME = "fifo1.test";
const int MAX_BUF = 80;

int main()
{
    int readfd, n;
    char buf[MAX_BUF];

    if (mknod(FIFO_NAME, S_IFIFO | 666, 0) < 0)
    {
        std::cout<<"Cannot create FIFO\n";
        return 0;
    }

    if ((readfd = open(FIFO_NAME, O_RDONLY)) < 0)
    {
        std::cout<<"Cannot open FIFO\n";
        return 0;
    }

    while ( (n = read(readfd, buf, MAX_BUF)) > 0)
    {
        if (write(1, buf, n) != n)
        {
            std::cout<<"Output error\n";
            return 0;
        }


    }
    close(readfd);

    return 0;
}


Ошибка - Cannot open FIFO. Я хз че делать.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Пример использования FIFO на Си

Сообщение eddy »

Я обычно mkfifo использую. Кроме того, если программа помимо чтения fifo должна делать еще что-то, лучше не блокировать трубу.
При чтении можно использовать fd_set'ы, чтобы понять, писалось ли что-то в трубу, и стоит ли его считывать.

Код: Выделить всё

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>

char * FIFO_NAME = "fifo1.test";
const int MAX_BUF = 80;

int main()
{
    int readfd, n;
    char buf[MAX_BUF];

    mkfifo(FIFO_NAME, 0666);

    if ((readfd = open(FIFO_NAME, O_RDONLY|O_NONBLOCK)) < 0)
    {
        std::cout<<"Cannot open FIFO\n";
        return 0;
    }

    while ( (n = read(readfd, buf, MAX_BUF)) > 0)
    {
        if (write(1, buf, n) != n)
        {
            std::cout<<"Output error\n";
            return 0;
        }


    }
    close(readfd);

    return 0;
}


P.S.
только это не С, а С++ :)
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Пример использования FIFO на Си

Сообщение Женя Подсыпальников »

GRS писал(а):
22.05.2009 12:46
Ошибка - Cannot open FIFO.


Выведи errno, опосля ошибки...
Можа, слэшей маловато, в имени ? :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Пример использования FIFO на Си

Сообщение eddy »

Женя Подсыпальников писал(а):
22.05.2009 13:19
Выведи errno, опосля ошибки...
Можа, слэшей маловато, в имени ? :)

Нет, фифо не открывался, т.к. права доступа надо писать в восьмеричной системе: 0666, а так получилось десятичное непонятно-что :)
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
GRS
Сообщения: 236
Статус: C++ Pro
ОС: Suse10.2/XP

Re: Пример использования FIFO на Си

Сообщение GRS »

2 eddy
спасибо, все понял.

P.S.
только это не С, а С++

Ну эт я, тут по привычке вывод через iostream делал, эти fifo/pipes все таки Сишные, ну всмысле из Сишних библиотек.
Спасибо сказали: