Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
1. Начните как обычно с директив
includeinputs#include <sys/types.h>#include <sys/time.h>#include <stdio.h>#include <fcntl.h>#include <sys/ioctl.h>#include <unistd.h>#include <stdlib.h>int main() { char buffer[128]; int result, nread; fd_set inputs, testfds; struct timeval timeout; FD_ZERO(&inputs); FD_SET(0, &inputs);2. Подождите ввод из файла stdin в течение максимум 2,5 секунд:
while(1) { testfds = inputs; timeout.tv_sec = 2; timeout.tv_usec = 500000; result = select(FD_SETSIZE, &testfds, (fd_set *)NULL, (fd_set*)NULL, &timeout);3. Спустя это время проверьте
result switch(result) { case 0: printf("timeoutn"); break; case -1: perror("select"); exit(1);4. Если во время ожидания у вас наблюдаются некоторые действия, связанные с файловым дескриптором, читайте ввод из stdin и выводите его при каждом получении символа EOL (конец строки), до нажатой комбинации клавиш <Ctrl>+<D>:
default: if (FD_ISSET(0, &testfds)) { ioctl(0, FIONREAD, &nread); if (nread == 0) { printf("keyboard donen"); exit(0); } nread = read(0, buffer, nread); buffer[nread] = 0; printf("read %d from keyboard: %s", nread, buffer); } break; } }}Во время выполнения эта программа каждые две с половиной секунды выводит строку
timeout$ <b>./select</b>timeout<b>hello</b>read 6 from keyboard: hello<b>fred</b>read 5 from keyboard: fredtimeout<b>^D</b>keyboard done$Как это работает
Программа применяет вызов
selectselectМножественные клиенты
Ваша простая серверная программа может выиграть от применения
selectСервер может применять функцию
selectFD_ISSETЕсли сокет, ожидающий запросов на подключение, готов к вводу, это означает, что клиент пытается подсоединиться, и вы можете вызывать функцию
acceptВыполните упражнение 15.9.
1. В финальный пример программы server5.с вы включите заголовочные файлы sys/time.h и sys/ioctl.h вместо signal.h, использованного в предыдущей программе, и объявите несколько дополнительных переменных для работы с вызовом
select#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <netinet/in.h>#include <sys/time.h>#include <sys/ioctl.h>#include <unistd.h>#include <stdlib.h>