LINUX.ORG.RU

Как определить, пуст ли stdin

 


0

2

Собственно, программа должна выполнять задачу, зависящую от поступающих по мере работы данных. При этом - если новых данных нет - то она не должна прерывать выполнение(читай - работать со старыми).

То есть что-то типа :

Data* data;
while(...) {
  task(data);
  if (! stdinEmpty()) {
    readData(data);
  }
}

В итоге, был приюзан следующий код :

int _kbhit() {
	static const int STDIN = 0;
	static int initialized = 0;
	if (! initialized) {
		struct termios term;
		tcgetattr(STDIN, &term);
		term.c_lflag &= ~ICANON;
		tcsetattr(STDIN, TCSANOW, &term);
		setbuf(stdin, NULL);
		initialized = 1;
	}
	int bytesWaiting;
	ioctl(STDIN, FIONREAD, &bytesWaiting);
	return bytesWaiting;
}
Велосипед с квадратными колёсами, однако, обретает форму.

alex4321
() автор топика
Ответ на: комментарий от val-amart

с ним приходилось (а может и сейчас приходится?) создавать отдельный тред почти на каждый вызов и основную работу делать на уровне libc. Библиотечный код реализующий стандартный интерфейс posix был страшен как смертный грех. A для основных приложений aio (а это к слову СУБД и главные на тот момент спонсоры IBM и Oracle) даже минимальные издержки на вызов select и отработку в ядре, были критичны. epoll пришёлся очень кстати, заодно и лимиты fd_set преодолены.

за современное состояние дел сказать не могу сказать - ушёл я от ядерных разработок примерно в то время.

MKuznetsov ★★★★★
()
Ответ на: комментарий от post-factum

Согласен. Поэтому придумали epoll.

Ляликсовызовы

anonymous
()
Ответ на: комментарий от post-factum

то в BSD есть «узкоспециализированный» kqueue (который ещё круче, если верить тому, что пишут).

Конечно круче

anonymous
()

Буду оригинален: FASYNC!

anonymous
()
Ответ на: комментарий от anonymous

А с прочим что не так? А про 0 - да, эпик :-)

alex4321
() автор топика
Ответ на: комментарий от post-factum

иногда вредно объяснять, как делать правильно. а то некоторые потом так и делают. всю жизнь. как в школе научили. потому что это «правильно». и бесполезно объяснять, что уже 21-й век, уже 4-й кернел, овощи, рожь, вот это всё.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

он более сложен - прикладнику приходится делать больше телодвижений и самый большой минус что epoll нестандартен и соотв. плохо портируем. Если заранее известно, что софт будет не только в linux, а в силу обстоятельств пишется на низком уровне (то есть стоит вопрос select/epoll/etc а не glib/ace/boost), то про epoll лучше забыть.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

я не понимаю аргументов про количество телодвижений. да, программирование - это работа, как ни странно. а не возня мышкой в идеешечке.
буст и ACE даже рядом не лежали по производительности. впрочем, под кросслатформу сервера и не пишут. так что тут действительно не важно, что использовать. можно играться в любые игрушки.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Eddy_Em

Я все делаю так, как мне хочется. И мне насрать на чужое мнение

Эдди себе не изменяет

Aswed ★★★★★
()
Ответ на: Ооййй от anonymous

знаешь, вот насрать совершенно. сиди и бойся!

Iron_Bug ★★★★★
()
Ответ на: комментарий от gh0stwizard

*Кхм, вспоминая про винду* не такой и кроссплатформенный. Сорри, что влез в вашу дискуссию.

select() на винде конечно с особенностями, но чем он принципиально не кроссплатформенный?

Harald ★★★★★
()
Ответ на: комментарий от Harald

select() на винде конечно с особенностями, но чем он принципиально не кроссплатформенный?

Тем, что с особенностями :) Нет, ну, если первый раз столкнешься и решишь, что дескрипторы select() хавает везде [и любые] (кроссплатформ же!), а потом оказывается, что на винде этот код не пашет. Так-то, во второй и следующие разы, он станет родным и кроссплатформенным. Вобщем, такие случаи, где запоминаешь какие-то особенности, сложно называть кроссплатформенными. Скорее platform-specific. А раз platform-specific, то рано или поздно напишешь сначала обертку, потом либу, потом фреймворк. И вот, когда ты забудешь все особенности, это станет кроссплатформой.

gh0stwizard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.