Программирование сокетов Linux: чтение данных с помощью SIGIO

Я кодировал программу, которая читает и записывает данные на некоторые выводы GPIO и получает некоторые данные через сокет, используя соединение датаграмм. Я хотел попробовать прочитать данные из сокета при получении сигнала SIGIO. Но когда я попытался это сделать, операции чтения / записи на выводах gpio начали давать сбой. Почему это происходит?

Если я не активирую операции чтения / записи gpio для выдачи сигнала SIGIO, я не должен получать сигнал SIGIO из-за операций чтения / записи на выводах gpio. Я ошибся? Или все операции ввода-вывода начинают перенаправляться на мой обработчик сигналов?

Вот фрагмент моего кода, где я активировал сигнал SIGIO для сокета.

int fd = socket( AF_INET, SOCK_DGRAM, 0 );
...
struct sigaction sa;
memset( &sa, 0, sizeof(struct sigaction) );
sigemptyset( &sa.sa_mask );
sa.sa_sigaction = SignalHandler;
sa.sa_flags = SA_RESTART | SA_SIGINFO;
sigaction( SIGIO, &sa, NULL );
fcntl( fd, F_SETOWN, getpid() );
fcntl( fd, F_SETSIG, SIGIO );
fcntl( fd, F_SETFL, O_NONBLOCK | O_ASYNC );

Благодарю.

Примечание: код очень большой и написан в концепции ООП. Кажется невозможным скопировать весь код сюда. Я только что скопировал код, связанный с моей проблемой здесь. Тем не менее, я создам MCVE и скопирую сюда через минуту. Кроме того, я пытаюсь понять концепцию сигнала Linux. Потому что это означает, что у меня нет понимания концепции сигнала или поведения SIGIO.

1

Решение

SIGIO — это одна большая корзина, которая может быть вызвана из разных источников одновременно.

Использование select () / poll () в основном цикле — лучший подход, чем полагаться на SIGIO

0

Другие решения


По вопросам рекламы [email protected]