LINUX.ORG.RU

История изменений

Исправление 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, но в следующий раз будем пытаться читать уже меньше символов.