2015-05-08 5 views
1

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

Если я не активирую операции чтения/записи 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.

+0

Пожалуйста, пост [MCVE] (http://stackoverflow.com/help/mcve). – MikeMB

+0

Я обновил свой вопрос. – haitaka

ответ

0

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

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

Смежные вопросы