У меня есть поток, который читает последовательное устройство (/dev/ttyUSB0) и записывает данные в стандартный вывод:
void io_thread_func () {
int serial_port = open(settings.port, O_RDWR);
while (1) {
char buf[100];
int n = read(serial_port, buf, 100);
fwrite(buf, 1, n, stdout);
}
}
Как я могу прервать системный вызов «read (...)» из другого потока? Могу ли я вызвать «close(serial_port)» из другого потока, чтобы прервать все функции блокировки ввода-вывода? (Мне нужно прервать функции блокировки ввода-вывода, чтобы правильно закрыть поток)
@TonyDelroy Непонятно, насколько полезен какой-либо из ответов.
Аналогичный вопрос, проверьте этот stackoverflow.com/questions/6910335/…
int pthread_kill(pthread_t tid, int sig);
отправляет сигнал sig
другому потоку в том же процессе
@Barmar: если это так, Глеб должен процитировать другой вопрос и сказать, как ответы были опробованы и потерпели неудачу для его цели (или предложить награду за лучшие решения существующего вопроса, но Глеб не может сделать это как новый участник - ни один из них не интернет-точка).
есть ли системный вызов «interrupt_all_io_functions (int fd)»? или нет ?
Сигналы posix (?) - единственный способ решить эту проблему?
Как я могу прервать системный вызов «read (...)» из другого потока? Могу ли я вызвать «close (serial_port)» из другого потока, чтобы прервать все функции блокировки ввода-вывода? (мне нужно прервать функции блокировки ввода-вывода, чтобы правильно закрыть поток)
Вы можете отправить сигнал потоку. Это прервет функцию read
.
Вы абсолютно не можете закрыть последовательный порт из другого потока. Это может вызвать всевозможные бедствия. Учитывать:
read
, но еще не позвонила.close
на serial_port
.read
другой поток accepts
входящее соединение сокета для критически важной внутренней цели системы.serial_port
.read
, а затем fwrite
, сбрасывая данные, полученные в критическом сокете, в stdout
.Хорошо, что это stdout
. Потому что ошибка однажды вызвала точно такой же сценарий — за исключением того, что конфиденциальные данные были отправлены на случайные входящие соединения из Интернета, а не stdout
.
есть ли системный вызов «interrupt_all_io_functions (int fd)»? или нет ?
Сигналы posix (?) - единственный способ решить эту проблему?
@glebzheglov Сигналы - это один из способов. Есть много других способов. В идеале вы просто не должны блокировать функцию, в которой не хотите ждать вечно. Например, вы можете poll
использовать как последовательный порт, так и локальный сокет. Чтобы разблокировать вызов poll
, вы можете просто отправить фиктивный байт в локальный сокет. Есть много способов сделать это.
Глеб: Рискну предположить, что Ваш вопрос практически идентичен stackoverflow.com/questions/3882379/… - Вы согласны?