С++ and pipeline (in_avail() не работает)

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

Аватара пользователя
korisk
Сообщения: 205
ОС: Xubuntu

С++ and pipeline

Сообщение korisk »

Нужна утилита, которая работала как grep. Используем С++.
$echo blah|util
или
$util
Тестовый пример:

Код:

// in_avail () example #include <iostream> using namespace std; int main () { streamsize size; char ch; streambuf * pbuf; pbuf = cin.rdbuf(); // cin >> ch; size = pbuf->in_avail(); cout << size << endl; return 0; }

Для gcc всегда возвращает 0. Вроде для MS VS++ отрабатывает правильно(читал, но не проверял).

Так вот вопрос:
может быть кто-то уже знает какой-нибудь workaround?
Спасибо.
Registerd Linux user #486684 at http://counter.li.org/
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5498
ОС: Gentoo

Re: С++ and pipeline

Сообщение /dev/random »

in_avail() возвращает длину _заполненной части буфера_. То, что в пайп передаются какие-то данные, вовсе не означает, что они уже были считаны из файлового дескриптора в буфер.

Что именно вы ожидаете увидеть? Полную длину потока? Или что?
Спасибо сказали:
Аватара пользователя
korisk
Сообщения: 205
ОС: Xubuntu

Re: С++ and pipeline

Сообщение korisk »

/dev/random писал(а):
10.01.2011 22:42
in_avail() возвращает длину _заполненной части буфера_. То, что в пайп передаются какие-то данные, вовсе не означает, что они уже были считаны из файлового дескриптора в буфер.

Что именно вы ожидаете увидеть? Полную длину потока? Или что?

ожидаю увидеть число не считанных символов.
Основная цель - избежать блокировки на ожидании ввода и добиться поведения аналогичного grep.

В с этого можно добиться с помощью select, а вот с потоками - не ясно.

pbuf->pubsync();
не помогает.


Registerd Linux user #486684 at http://counter.li.org/
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5498
ОС: Gentoo

Re: С++ and pipeline

Сообщение /dev/random »

korisk писал(а):
10.01.2011 23:04
Основная цель - избежать блокировки на ожидании ввода и добиться поведения аналогичного grep.

В с этого можно добиться с помощью select, а вот с потоками - не ясно.

Так. Я правильно понял? Вам нужно считать строку и начать её обрабатывать, не дожидаясь поступления первых символов следующей строки? Если так, то простого getline() должно быть достаточно. Или вам нужно что-то другое?
Спасибо сказали:
Аватара пользователя
korisk
Сообщения: 205
ОС: Xubuntu

Re: С++ and pipeline

Сообщение korisk »

/dev/random писал(а):
10.01.2011 23:16
korisk писал(а):
10.01.2011 23:04
Основная цель - избежать блокировки на ожидании ввода и добиться поведения аналогичного grep.

В с этого можно добиться с помощью select, а вот с потоками - не ясно.

Так. Я правильно понял? Вам нужно считать строку и начать её обрабатывать, не дожидаясь поступления первых символов следующей строки? Если так, то простого getline() должно быть достаточно. Или вам нужно что-то другое?

getline() вызывает блокировку на ожидание первой строки.
Задача - избежать блокировки. что-то типа kbhit
Registerd Linux user #486684 at http://counter.li.org/
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5498
ОС: Gentoo

Re: С++ and pipeline

Сообщение /dev/random »

korisk писал(а):
10.01.2011 23:48
getline() вызывает блокировку на ожидание первой строки.
Задача - избежать блокировки. что-то типа kbhit

Вам нужно что-то делать во время ожидания первой строки? Если да, то что? Читать из других потоков? Что-то считать? Общаться с пользователем? Что?

Все подобные решения всегда блокируют программу. Даже select() блокирует её и ждёт события. Вопрос лишь в том, когда и как блокировать. И это зависит от конкретной задачи.
Спасибо сказали:
Аватара пользователя
korisk
Сообщения: 205
ОС: Xubuntu

Re: С++ and pipeline

Сообщение korisk »

/dev/random писал(а):
10.01.2011 23:56
korisk писал(а):
10.01.2011 23:48
getline() вызывает блокировку на ожидание первой строки.
Задача - избежать блокировки. что-то типа kbhit

Вам нужно что-то делать во время ожидания первой строки? Если да, то что? Читать из других потоков? Что-то считать? Общаться с пользователем? Что?

Все подобные решения всегда блокируют программу. Даже select() блокирует её и ждёт события. Вопрос лишь в том, когда и как блокировать. И это зависит от конкретной задачи.

для select можно указать время ожидания несколько миллисекунд.


echo asdfsdf > /tmp/file;
grep /tmp/file asd #не захватывает ввод
cat /tmp/file|grep asd #тоже не захватывает
как этого добиться в С++? вот и вся задача.
Registerd Linux user #486684 at http://counter.li.org/
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5498
ОС: Gentoo

Re: С++ and pipeline

Сообщение /dev/random »

korisk писал(а):
11.01.2011 00:11
echo asdfsdf > /tmp/file;
grep /tmp/file asd #не захватывает ввод
cat /tmp/file|grep asd #тоже не захватывает
как этого добиться в С++? вот и вся задача.

Какой ввод оно не захватывает? Терминал? Оно с терминала не читает. Файл? В линуксе нет такого понятия как "захватывание файла", это только в винде пока из него читают, писать в него нельзя. Что вы имеете в виду под "захватыванием"?
Спасибо сказали:
Аватара пользователя
korisk
Сообщения: 205
ОС: Xubuntu

Re: С++ and pipeline

Сообщение korisk »

/dev/random писал(а):
11.01.2011 00:23
korisk писал(а):
11.01.2011 00:11
echo asdfsdf > /tmp/file;
grep /tmp/file asd #не захватывает ввод
cat /tmp/file|grep asd #тоже не захватывает
как этого добиться в С++? вот и вся задача.

Какой ввод оно не захватывает? Терминал? Оно с терминала не читает. Файл? В линуксе нет такого понятия как "захватывание файла", это только в винде пока из него читают, писать в него нельзя. Что вы имеете в виду под "захватыванием"?

попробуйте скомпилировать этот код:

Код:

// in_avail () example #include <iostream> using namespace std; int main () { string ch; cin >> ch; cout << ch << endl; return 0; }


korisk@kaa:~/tmp$ echo "asdfsdf"|./a.out
asdfsdf
#прошло нормально
korisk@kaa:~/tmp$ ./a.out
^C
#заблокировано,захвачено итп. , но прервано сигналом
Registerd Linux user #486684 at http://counter.li.org/
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5498
ОС: Gentoo

Re: С++ and pipeline

Сообщение /dev/random »

korisk писал(а):
11.01.2011 00:41
korisk@kaa:~/tmp$ echo "asdfsdf"|./a.out
asdfsdf
#прошло нормально
korisk@kaa:~/tmp$ ./a.out
^C
#заблокировано,захвачено итп. , но прервано сигналом

Не вижу разницы с этим:

Shell

$ grep qwe ^C

Спасибо сказали:
Аватара пользователя
korisk
Сообщения: 205
ОС: Xubuntu

Re: С++ and pipeline

Сообщение korisk »

/dev/random писал(а):
11.01.2011 00:45
korisk писал(а):
11.01.2011 00:41
korisk@kaa:~/tmp$ echo "asdfsdf"|./a.out
asdfsdf
#прошло нормально
korisk@kaa:~/tmp$ ./a.out
^C
#заблокировано,захвачено итп. , но прервано сигналом

Не вижу разницы с этим:

Shell

$ grep qwe ^C



мде ) идея понятна, но в моем примере используются параметры. Возможно я чего-то не вижу, но не знаю как реализовать такую возможность.
Ведь если явные параметры у команды есть, то данные могут поступать и через канал...
(проверка на источник ввода - клавиатура или канал)
Registerd Linux user #486684 at http://counter.li.org/
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: С++ and pipeline

Сообщение Portnov »

man isatty
?
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5498
ОС: Gentoo

Re: С++ and pipeline

Сообщение /dev/random »

korisk писал(а):
11.01.2011 07:54
мде ) идея понятна, но в моем примере используются параметры. Возможно я чего-то не вижу, но не знаю как реализовать такую возможность.
Ведь если явные параметры у команды есть, то данные могут поступать и через канал...
(проверка на источник ввода - клавиатура или канал)

int main(int argc, char **argv) {
// если переданы параметры, открываем этот файл, иначе читаем stdin.
// Просто читаем построчно, не заботясь о буферах и задержках
// Именно так ведёт себя grep
}
Спасибо сказали:
Аватара пользователя
korisk
Сообщения: 205
ОС: Xubuntu

Re: С++ and pipeline

Сообщение korisk »

Portnov писал(а):
11.01.2011 09:01
man isatty
?

Спасибо! То что нужно
Registerd Linux user #486684 at http://counter.li.org/
Спасибо сказали:
Аватара пользователя
korisk
Сообщения: 205
ОС: Xubuntu

Re: С++ and pipeline

Сообщение korisk »

Registerd Linux user #486684 at http://counter.li.org/
Спасибо сказали: