Модератор: Модераторы разделов
GRS
Сообщения: 236
Статус: C++ Pro
ОС: Suse10.2/XP
Сообщение
GRS » 22.05.2009 12:46
В книге Робачевского есть пример юза 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
Сообщение
eddy » 22.05.2009 13:11
Я обычно 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
Сообщение
Женя Подсыпальников » 22.05.2009 13:19
GRS писал(а): ↑ 22.05.2009 12:46
Ошибка - Cannot open FIFO.
Выведи errno, опосля ошибки...
Можа, слэшей маловато, в имени ?
Пойдём на рыбалку !
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Сообщение
eddy » 22.05.2009 13:25
Женя Подсыпальников писал(а): ↑ 22.05.2009 13:19
Выведи errno, опосля ошибки...
Можа, слэшей маловато, в имени ?
Нет, фифо не открывался, т.к. права доступа надо писать в восьмеричной системе: 0666, а так получилось десятичное непонятно-что
RTFM
-------
KOI8-R - патриотичная кодировка
GRS
Сообщения: 236
Статус: C++ Pro
ОС: Suse10.2/XP
Сообщение
GRS » 25.05.2009 13:56
2 eddy
спасибо, все понял.
P.S.
только это не С, а С++
Ну эт я, тут по привычке вывод через iostream делал, эти fifo/pipes все таки Сишные, ну всмысле из Сишних библиотек.