История изменений
Исправление KivApple, (текущая версия) :
Так select же используется как раз для блокирующего режима: перед каждым read (и даже write) делаем select.
select позволяет уснуть, пока не появятся входящие символы, чтобы зря не грузить процессор busy loop. Затем вызываем неблокирующий read (открываем файл с флагом O_NDELAY). Зачем неблокирующий? Потому что select лишь гарантирует, что там не меньше 1 символа пришло, но он не знает, что мы хотим прочитать их, скажем, 100. В этом случае read вполне может заблокироваться. А в таком режиме он не заблокируется, а вернёт сколько символов реально получилось прочитать. Если прочитались не все, то запускаем новый select, но в следующий раз будем пытаться читать уже меньше символов (а ещё timeout у select надо уменьшить на длительность вызова прошлого select).
Я уже написал реализацию, отлично работает. Более того, можно ждать больше 255 символов и дольше 25.5 секунд. Заодно применимо не только к последовательному порту, но и к сокетам и стандартному потоку ввода.
Исправление KivApple, :
Так select же используется как раз для блокирующего режима: перед каждым read (и даже write) делаем select.
select позволяет уснуть, пока не появятся входящие символы, чтобы зря не грузить процессор busy loop. Затем вызываем неблокирующий read (открываем файл с флагом O_NDELAY). Зачем неблокирующий? Потому что select лишь гарантирует, что там не меньше 1 символа пришло, но он не знает, что мы хотим прочитать их, скажем, 100. В этом случае read вполне может заблокироваться. А в таком режиме он не заблокируется, а вернёт сколько символов реально получилось прочитать. Если прочитались не все, то запускаем новый select, но в следующий раз будем пытаться читать уже меньше символов (а ещё timeout у select надо уменьшить на длительность вызова прошлого select).
Я уже написал реализацию, отлично работает. Более того, можно ждать больше 255 символов и дольше 25.5 секунд. Заодно применимо не только к последовательному порту, но и к сокетам.
Исправление KivApple, :
Так select же используется как раз для блокирующего режима: перед каждым read (и даже write) делаем select.
select позволяет уснуть, пока не появятся входящие символы, чтобы зря не грузить процессор busy loop. Затем вызываем неблокирующий read (открываем файл с флагом O_NDELAY). Зачем неблокирующий? Потому что select лишь гарантирует, что там не меньше 1 символа пришло, но он не знает, что мы хотим прочитать их, скажем, 100. В этом случае read вполне может заблокироваться. А в таком режиме он не заблокируется, а вернёт сколько символов реально получилось прочитать. Если прочитались не все, то запускаем новый select, но в следующий раз будем пытаться читать уже меньше символов (а ещё timeout у select надо уменьшить на длительность вызова прошлого select).
Исходная версия KivApple, :
Так select же используется как раз для блокирующего режима: перед каждым read (и даже write) делаем select.
select позволяет уснуть, пока не появятся входящие символы, чтобы зря не грузить процессор busy loop. Затем вызываем неблокирующий read (открываем файл с флагом O_NDELAY). Зачем неблокирующий? Потому что select лишь гарантирует, что там не меньше 1 символа пришло, но он не знает, что мы хотим прочитать их, скажем, 100. В этом случае read вполне может заблокироваться. А в таком режиме он не заблокируется, а вернёт сколько символов реально получилось прочитать. Если прочитались не все, то запускаем новый select, но в следующий раз будем пытаться читать уже меньше символов.