Вопрос из области легендарного "объясните как работает программа, которую я написал".
Суть: необходимо читать из stdin с помощью epoll, пока пользователь не отправит EOF. А как отправит - завершить работу. Т.е. как cat, запущенная без аргументов.
Мой код:
int epfd = epoll_create(1);
if(epfd == -1)
{
perror("epoll_create is bad");
exit(EXIT_FAILURE);
}
static struct epoll_event ev;
ev.events = EPOLLIN;
ev.data.fd = STDIN_FILENO;
if(epoll_ctl(epfd, EPOLL_CTL_ADD, STDIN_FILENO, &ev) == -1)
{
perror("epoll_ctl connSock is bad");
exit(EXIT_FAILURE);
}
string buffLine = "";
vector<string> urls;
char buffer;
char c;
while(true)
{
memset(&ev, 0, sizeof(ev));
int nfds = epoll_wait(epfd, &ev, 1, 3000);
if(nfds == -1)
{
perror("epoll_wait is bad");
exit(EXIT_FAILURE);
}
if((ev.data.fd == STDIN_FILENO) && (ev.events == EPOLLIN))
{
/* Не понимаю, почему всё хорошо работает.
* Почему getchar() считывает все символы.*/
c = getchar();
cout << "C = " << c << endl;
if(c == EOF) // Пользователь передал EOF
break;
if(c == '\n') // Пользователь завершил ввод текущей url
{
urls.push_back(buffLine);
buffLine.clear();
}
else
buffLine += c;
}
Я полагал, что getchar() будет хватать один символ, а там придётся ещё вводить один цикл или вроде того. Пожалуйста, объясните, почему getchar() считывает правильно все символы и всё работает так, как нужно.