poll/epoll 处理是否在中断上下文中?
Does poll/epoll handling is in interrupt context?
对于某些人来说,这可能是一个微不足道的问题,但我不确定。
当轮询来自内核的事件时,新事件的处理是在中断上下文中完成的吗?
如果不是,是否意味着我们可以在处理程序中sleep/wait(使用处理程序中的其他命令)?
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;
}
谢谢,
运行
没有(一般)。
当您调用 poll()
时,处理器上下文切换到内核上下文,而其他进程(和内核线程)运行。在至少有一个 FD 准备就绪后,您的流程将在某个时间点切换回上下文。通常(例如考虑管道),不需要中断上下文,但请注意一些 I/O 需要中断上下文发生(不直接连接到 poll()
)。
对于某些人来说,这可能是一个微不足道的问题,但我不确定。
当轮询来自内核的事件时,新事件的处理是在中断上下文中完成的吗?
如果不是,是否意味着我们可以在处理程序中sleep/wait(使用处理程序中的其他命令)?
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;
}
谢谢, 运行
没有(一般)。
当您调用 poll()
时,处理器上下文切换到内核上下文,而其他进程(和内核线程)运行。在至少有一个 FD 准备就绪后,您的流程将在某个时间点切换回上下文。通常(例如考虑管道),不需要中断上下文,但请注意一些 I/O 需要中断上下文发生(不直接连接到 poll()
)。