В качестве альтернативы select()
для конкретного случая последовательного порта (терминала) вы можете использовать tcsetattr()
, чтобы перевести файловый дескриптор в неканонический режим с таймаутом чтения.
Для этого снимите флажок ICANON
и установите управляющий символ VTIME
:
struct termios termios;
tcgetattr(filedesc, &termios);
termios.c_lflag &= ~ICANON; /* Set non-canonical mode */
termios.c_cc[VTIME] = 100; /* Set timeout of 10.0 seconds */
tcsetattr(filedesc, TCSANOW, &termios);
Примечание VTIME
измеряется в десятых долях секунды, и тип, используемый для него, обычно равен unsigned char
, что означает, что максимальное время ожидания составляет 25,5 секунд.