Я разрабатываю приложение, которое собирается читать данные из последовательного порта / UART в Linux.Я пытаюсь разбудить / разблокировать pthread, который начал считывать данные, когда UART асинхронно получает данные из внешнего источника.Я пытался использовать сигнал (SIGIO) «мягкое прерывание» вместо select () или pselect (), но я не уверен, что могу получить желаемое поведение в многопоточном приложении из сигналов.
Когда я настраиваю дескриптор файла устройства, я хочу установить F_SETOWN (int), чтобы заставить ядро отправлять сигнал в pthread, который я настроил для блокировки на SIGIO.
// Configure the signal to send
fcntl(m_fileId, F_SETSIG, m_sigNum);
// Set to non-blocking read mode
fcntl(m_fileId, F_SETFL, FNDELAY);
// Bind the PID of the task which is getting the signal
fcntl(m_fileId, F_SETOWN, m_pid);
// Enable sending a signal when data ready
fcntl(m_fileId, F_SETFL, O_ASYNC);
Я понял, чточто когда я писал код, для m_pid был задан идентификатор процесса, а не идентификатор pthread, а когда я проверял страницу руководства ...
Согласно справочной странице fnctl (2):
F_SETOWN (int)
Установите идентификатор процесса или идентификатор группы процессов, которые будут получать сигналы SIGIO и SIGURG для событий в файловом дескрипторе fd, на идентификатор, указанный в аргументе arg.Идентификатор процесса указывается как положительное значение;идентификатор группы процессов указан как отрицательное значение.Чаще всего вызывающий процесс указывает себя в качестве владельца (то есть arg указывается как getpid (2)).
Вместо использования getpid () для идентификатора процесса вы можете передать идентификатор pthread из вызова pthread_self (), чтобы только конкретный поток получил сигнал?