Способ, которым я делал это в прошлом, заключается в том, чтобы настроить порт для асинхронного ввода-вывода, используя VMIN 0 и VTIME, скажем, 5 децисекунд.Цель этого состояла в том, чтобы позволить потоку заметить, когда пришло время завершать работу приложения, поскольку он мог попытаться прочитать, установить тайм-аут, проверить наличие флага выхода и затем попытаться прочитать еще немного.
Вот пример функции чтения:
size_t myread(char *buf, size_t len) {
size_t total = 0;
while (len > 0) {
ssize_t bytes = read(fd, buf, len);
if (bytes == -1) {
if (errno != EAGAIN && errno != EINTR) {
// A real error, not something that trying again will fix
if (total > 0) {
return total;
}
else {
return -1;
}
}
}
else if (bytes == 0) {
// EOF
return total;
}
else {
total += bytes;
buf += bytes;
len -= bytes;
}
}
return total;
}
Функция записи будет выглядеть так, как вы ожидаете.
В вашей функции настройки обязательно установите:
struct termios tios;
...
tios.c_cflag &= ~ICANON;
tios.c_cc[VMIN] = 0;
tios.c_cc[VTIME] = 5; // You may want to tweak this; 5 = 1/2 second, 10 = 1 second, ...
...