- Платформа: Linux 3.2.0 x86 (Debian 7)
- Компилятор: GCC 4.7.2 (Debian 4.7.2-5)
Я пишу функцию, которая читает один символ из stdin, если символ уже присутствует в stdin. Если stdin пуст, функция не должна ничего делать и возвращает -1. Я искал неблокирующий вход в Google и был отмечен poll() или select(). Сначала я попытался использовать select(), но я не мог заставить его работать, поэтому попробовал опрос() и пришел к такому же выводу. Я не уверен, что эти функции делают точно, но из того, что я понимаю в документации poll(), если я так называю:
struct pollfd pollfds;
pollfds = STDIN_FILENO;
pollfds.events = POLLIN;
poll(pollfds, 1, 0);
if (pollfds.revents и POLLIN) будет истинным, если "Данные, отличные от высокоприоритетных данных, могут быть прочитаны без блокировки". Но опрос() всегда бывает в моей тестовой ситуации. Как я могу проверить функцию, может быть проблема, но функциональность, которую я хочу, именно то, что я тестирую. Вот и текущая функция и тестовая ситуация.
#include <poll.h>
#include <stdio.h>
#include <unistd.h>
int ngetc(char *c)
{
struct pollfd pollfds;
pollfds.fd = STDIN_FILENO;
pollfds.events = POLLIN;
poll(&pollfds, 1, 0);
if(pollfds.revents & POLLIN)
{
//Bonus points to the persons that can tell me if
//read() will change the value of '*c' if an error
//occurs during the read
read(STDIN_FILENO, c, 1);
return 0;
}
else return -1;
}
//Test Situation:
//Try to read a character left in stdin by an fgets() call
int main()
{
int ret = 0;
char c = 0;
char str[256];
//Make sure to enter more than 2 characters so that the excess
//is left in stdin by fgets()
fgets(str, 2, stdin);
ret = ngetc(&c);
printf("ret = %i\nc = %c\n", ret, c);
return 0;
}