in_avail() возвращает длину _заполненной части буфера_. То, что в пайп передаются какие-то данные, вовсе не означает, что они уже были считаны из файлового дескриптора в буфер.
Что именно вы ожидаете увидеть? Полную длину потока? Или что?
in_avail() возвращает длину _заполненной части буфера_. То, что в пайп передаются какие-то данные, вовсе не означает, что они уже были считаны из файлового дескриптора в буфер.
Что именно вы ожидаете увидеть? Полную длину потока? Или что?
ожидаю увидеть число не считанных символов.
Основная цель - избежать блокировки на ожидании ввода и добиться поведения аналогичного grep.
В с этого можно добиться с помощью select, а вот с потоками - не ясно.
Основная цель - избежать блокировки на ожидании ввода и добиться поведения аналогичного grep.
В с этого можно добиться с помощью select, а вот с потоками - не ясно.
Так. Я правильно понял? Вам нужно считать строку и начать её обрабатывать, не дожидаясь поступления первых символов следующей строки? Если так, то простого getline() должно быть достаточно. Или вам нужно что-то другое?
Основная цель - избежать блокировки на ожидании ввода и добиться поведения аналогичного grep.
В с этого можно добиться с помощью select, а вот с потоками - не ясно.
Так. Я правильно понял? Вам нужно считать строку и начать её обрабатывать, не дожидаясь поступления первых символов следующей строки? Если так, то простого getline() должно быть достаточно. Или вам нужно что-то другое?
getline() вызывает блокировку на ожидание первой строки.
Задача - избежать блокировки. что-то типа kbhit
getline() вызывает блокировку на ожидание первой строки.
Задача - избежать блокировки. что-то типа kbhit
Вам нужно что-то делать во время ожидания первой строки? Если да, то что? Читать из других потоков? Что-то считать? Общаться с пользователем? Что?
Все подобные решения всегда блокируют программу. Даже select() блокирует её и ждёт события. Вопрос лишь в том, когда и как блокировать. И это зависит от конкретной задачи.
getline() вызывает блокировку на ожидание первой строки.
Задача - избежать блокировки. что-то типа kbhit
Вам нужно что-то делать во время ожидания первой строки? Если да, то что? Читать из других потоков? Что-то считать? Общаться с пользователем? Что?
Все подобные решения всегда блокируют программу. Даже select() блокирует её и ждёт события. Вопрос лишь в том, когда и как блокировать. И это зависит от конкретной задачи.
для select можно указать время ожидания несколько миллисекунд.
echo asdfsdf > /tmp/file;
grep /tmp/file asd #не захватывает ввод
cat /tmp/file|grep asd #тоже не захватывает
как этого добиться в С++? вот и вся задача.
echo asdfsdf > /tmp/file;
grep /tmp/file asd #не захватывает ввод
cat /tmp/file|grep asd #тоже не захватывает
как этого добиться в С++? вот и вся задача.
Какой ввод оно не захватывает? Терминал? Оно с терминала не читает. Файл? В линуксе нет такого понятия как "захватывание файла", это только в винде пока из него читают, писать в него нельзя. Что вы имеете в виду под "захватыванием"?
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;
}
мде ) идея понятна, но в моем примере используются параметры. Возможно я чего-то не вижу, но не знаю как реализовать такую возможность.
Ведь если явные параметры у команды есть, то данные могут поступать и через канал...
(проверка на источник ввода - клавиатура или канал)
мде ) идея понятна, но в моем примере используются параметры. Возможно я чего-то не вижу, но не знаю как реализовать такую возможность.
Ведь если явные параметры у команды есть, то данные могут поступать и через канал...
(проверка на источник ввода - клавиатура или канал)
int main(int argc, char **argv) {
// если переданы параметры, открываем этот файл, иначе читаем stdin.
// Просто читаем построчно, не заботясь о буферах и задержках
// Именно так ведёт себя grep
}