OSPFD中的主循环处理
程序清单14.3展示了ospfd
的主循环处理过程。你可以在文件ospfd_linux.C
中找到这一段代码。让我们仔细看看它是如何工作的:
while (1) {
int msec_tmo;
int err;
FD_ZERO(&fdset);
FD_ZERO(&wrset);
n_fd = ospfd_sys->netfd;
FD_SET(ospfd_sys->netfd, &fdset);
ospfd_sys->mon_fd_set(n_fd, &fdset, &wrset);
if (ospfd_sys->igmpfd != -1) {
FD_SET(ospfd_sys->igmpfd, &fdset);
n_fd = MAX(n_fd, ospfd_sys->igmpfd);
}
ospf->tick();
msec_tmo = ospf->timeout();
ospf->logflush();
sigprocmask(SIG_SETMASK, &osigset, NULL);
if (msec_tmo != -1) {
timeval timeout;
timeout.tv_sec = msec_tmo / 1000;
timeout.tv_usec = (msec_tmo % 1000) * 1000;
err = select(n_fd + 1, &fdset, &wrset, 0, &timeout);
} else {
err = select(n_fd + 1, &fdset, &wrset, 0);
}
if (err == -1 && errno != EINTR) {
syslog(LOG_ERR, "select failed %m");
exit(1);
}
ospfd_sys->time_update();
sigprocmask(SIG_BLOCK, &sigset, &osigset);
if (err <= 0)
continue;
if (FD_ISSET(ospfd_sys->netfd, &fdset))
ospfd_sys->raw_receive(ospfd_sys->netfd);
if (ospfd_sys->igmpfd != -1 && FD_ISSET(ospfd_sys->igmpfd, &fdset))
ospfd_sys->raw_receive(ospfd_sys->igmpfd);
ospfd_sys->process_mon_io(&fdset, &wrset);
}
在这段代码中,while(1)
表示一个无限循环。为什么要这样写呢?因为这是在持续监控和处理网络事件。每次循环都会清空文件描述符集合,然后根据不同的条件设置这些文件描述符。
关于select
函数的处理
select
函数在这段代码中扮演了关键角色。如果你对 select
不了解,可以阅读这篇关于Android超时处理的文章,它解释了超时机制以及如何使用 select
函数进行网络编程。这有助于理解代码中如何通过 select
来监控多个文件描述符。
信号处理的细节
代码中多次提到了 sigprocmask
函数,它用来设置和阻塞信号。如果你对信号处理机制感兴趣,不妨看看这篇关于Linux信号signal处理机制的文章。这里详细解释了信号的阻塞和处理,对于理解 ospfd
中的信号处理部分非常有帮助。
其他相关资源
代码还涉及到 raw_receive
函数,这部分处理原始数据包的接收。想深入了解更多相关信息?这篇关于数据信号处理的文章将会是一个很好的开始。
程序的每个部分都至关重要,它们共同协作,保证了 ospfd
的稳定运行和高效处理。想象一下,这些代码片段就像一群默契配合的乐队成员,各司其职,共同演奏出一曲流畅的交响乐。希望这些链接能帮助你更好地理解这段代码的运行机制。
下载地址
用户评论