Такая проблема, в лабораторной работе необходимо рассказать о функции
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *utimeout);
Возник вопрос: "Как функция получает информацию о том, что в потоке что-нибудь появилось?"
К чему я пришла:
-внутри select есть функция pool, которая мониторит поток.
За отведенное время poll поочерёдно обходит по запрошенным файловым дескрипторам, получает сведения полные сведения об открытом файле через файловый дескриптор с помощью вызова функции соответствующей функции:
struct file {
...
struct file_operations *f_op;
...
}
и вызывает на каждом из них специальную функцию, аргументами которой будут являться собственно сам файл и соответственно запрашиваемые события, и она должна возвратить какой-то результат взависимости от запрошенных событий:
struct file_operations {
...
unsigned int (*poll) (struct file *, struct poll_table_struct *);
...
};
Эту функцию должен реализовать драйвер того символьного устройства, с которого будет производится, например, чтение каких-то данных (в моем случае это чтение данных с терминала, то таким “виртуальным” символьным устройством будет являться bash).
Обход происходит до тех пор, пока не закончится отведенное на опрос файлов время, или же пока не произошло какое-либо запрошенное событие.
Но преподаватель не принимает такой ответ, говорит, типа, это все верно, но все таки, из=-за чего срабатывает pool? я отвечаю, что срабатывает драйвер устройства. Он говорит, что это не совсем правда и приводит в пример чтение файла. Я, конечно, не совсем поняла, что такое устройство, но, как мне кажется, файл устройством не является...