2016-12-18 13 views
1

Это, наверное, тривиальный вопрос для некоторых людей, но почему-то я не уверен в этом.Выполняется ли обработка опроса/epoll в контексте прерывания?

Ожидая с опроса для события из ядра, связано с тем, что обработка нового события выполняется в контексте прерывания?

Если нет, значит ли это, что мы можем спать/ждать (используя другие команды в обработчике) в обработчике?

int main (void) 
{ 
    struct pollfd fds[2]; 
    int ret; 


    fds[0].fd = FILENO; 
    fds[0].events = POLLIN; 


    fds[1].fd = FILENO; 
    fds[1].events = POLLOUT; 

    ret = poll(fds, 2, TIMEOUT * 1000); 

    if (ret == -1) { 
     perror ("poll"); 
     return 1; 
    } 

    if (!ret) { 
     return 0; 
    } 

    if (fds[0].revents & POLLIN) 
    { 
     /********** HANDLING EVENTS HERE ***************/ 
     printf ("FILENO is POLLIN\n"); 
    } 

    if (fds[1].revents & POLLOUT) 
    { 
     /********** HANDLING EVENTS HERE ***************/ 
     printf ("FILENO is POLLOUT\n"); 
    } 

    return 0; 

} 

Спасибо, Ран

+0

«контекст прерывания» - это проблема уровня ядра. Это не влияет на программы пользовательского пространства. – davmac

ответ

1

Нет (в целом).

Когда вы вызываете poll(), контекст процессора переключается на контекст ядра и запускаются другие процессы (и потоки ядра). В какой-то момент ваш процесс будет переключен в контекст после того, как будет готов хотя бы один из ваших FD. В общем случае (рассмотрим, например, трубу) для этого не требуется контекст прерывания, хотя обратите внимание, что некоторые операции ввода-вывода требуют контекста прерывания (напрямую не подключенного к poll()).

+0

Это драйвер ядра, который запускает события таймера в пользовательское пространство, модуль, который обертывает hrtimer и поддерживает опрос из пользовательского пространства. – ransh

+0

@ransh: ваш вопрос (который не упоминал таймеры) спросил * «это то, что обработка нового события выполняется в контексте прерывания» *; ответ на это по-прежнему нет. Может быть прерывание таймера, которое инициирует событие, но фактическая обработка события и контекстного переключателя выполняется в контексте ядра. – abligh

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

  • Нет связанных вопросов^_^