Использование select
/ poll
для мультиплексирования ввода / вывода требует, чтобы программа активно проверяла вход. Поэтому любая работа, кроме этой, должна выполняться с использованием отдельных потоков. Я исключил необходимость этого активного опроса, используя fcntl
, чтобы получать сигнал, отправляемый моему процессу, когда дескрипторы файлов, которые я просматриваю, готовы к IO. Поэтому, только когда я получу сигнал, я опрошу дескрипторы и буду действовать соответственно.
Я написал рабочую программу, использующую это. Есть ли какие-либо недостатки / недостатки / потенциальные ошибки, вытекающие из этого? Существуют ли значительные издержки ядра для отправки этих сигналов? Если да, то как мне оценить производительность и сравнить ее с обычными методами?
Основа c контур / псевдокод моей рабочей программы
void hdfn(int signo)
{
fd_set rset;
FD_ZERO(&rset);
int maxfd = max_of_fds + 1; //find max
for(i : fds)
FD_SET(i, &rset);
select(maxfd, &rset, NULL, NULL, NULL);
for(i : fds)
if (FD_ISSET(i, &rset))
//do something
}
int main()
{
signal(SIGUSR1, hdfn);
.....
//open different fds
//do something
.....
//loop to get a signal sent for every input
for(i : fds)
{
fcntl(i, F_SETFL, O_ASYNC);
fcntl(i, __F_SETSIG, SIGUSR1);
fcntl(i, F_SETOWN, getpid());
}
while (1)
{
//Server does some other work until signal for IO is recieved.
}
return 0;
}