Неблокирующий Получить Персонаж
Я пишу функцию, которая читает один символ из стандартного ввода, если символ уже присутствует в стандартном вводе. Если stdin пуст, предполагается, что функция ничего не делает и возвращает -1. Я погуглил неблокирующий ввод и указал наопрос() или жеВыбрать(), Сначала я попытался использовать select (), но не смог заставить его работать, поэтому я попробовал poll () и пришел к тому же выводу. Я не уверен, что именно делают эти функции, но из того, что я понимаю из документации poll (), если я назову это так:
struct pollfd pollfds;
pollfds = STDIN_FILENO;
pollfds.events = POLLIN;
poll(pollfds, 1, 0);
if (pollfds.revents & POLLIN) будет истинным, если «Данные, отличные от данных с высоким приоритетом, могут быть прочитаны без блокировки.». Но poll () всегда прерывается в моей тестовой ситуации. Может быть проблема в том, как я тестирую функцию, но именно ту функциональность, которую я хочу, я и проверяю. Вот функция в настоящее время и тестовая ситуация.
#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;
}