在我的程序中,我有一个线程需要持续监控网络接口,因此它会在while循环中连续使用getifaddrs()函数。
操作系统: Red Hat Enterprise Linux Server 7.8版本(Maipo) GLIBC 版本: 2.17
while(true) {
struct ifaddrs *ifaddr, *ifa;
if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs couldn't fetch required data");
exit(EXIT_FAILURE);
}
//Iterate through interfaces linked list
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
//monitoring logic
}
//Free linked list
freeifaddrs(ifaddr);
//Sleep for specified time fo next polling cycle
usleep(1000);
}
我的程序大部分时间都正常工作。然而,有时候getifaddrs()会返回-1和errNo=EBADF(坏文件描述符)。为了不退出我的线程,我暂时用continue替换了exit(因为我不想因此结束我的程序)。但是,我很想知道在哪些情况下getifaddrs()会返回“坏文件描述符”错误,并且我是否可以做一些事情来避免这种情况发生?
编辑
用'continue'替换'exit'并没有解决我的问题。有时对getifaddrs()的调用会导致应用程序崩溃!
下面是使用生成的核心文件从gdb获取的回溯信息。
Program terminated with signal 6, Aborted.
#0 0x00007fe2df1ef387 in raise () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.17-307.el7.1.x86_64 keyutils-libs-1.5.8-3.el7.x86_64 krb5-libs-1.15.1-37.el7_6.x86_64 libcom_err-1.42.9-16.el7.x86_64 libgcc-4.8.5-39.el7.x86_64 libselinux-2.5-14.1.el7.x86_64 libstdc++-4.8.5-39.el7.x86_64 openssl-libs-1.0.2k-19.el7.x86_64 pcre-8.32-17.el7.x86_64 zlib-1.2.7-18.el7.x86_64
(gdb) bt
#0 0x00007fe2df1ef387 in raise () from /lib64/libc.so.6
#1 0x00007fe2df1f0a78 in abort () from /lib64/libc.so.6
#2 0x00007fe2df231ed7 in __libc_message () from /lib64/libc.so.6
#3 0x00007fe2df231fbe in __libc_fatal () from /lib64/libc.so.6
#4 0x00007fe2df2df4c2 in __netlink_assert_response () from /lib64/libc.so.6
#5 0x00007fe2df2dc412 in __netlink_request () from /lib64/libc.so.6
#6 0x00007fe2df2dc5ef in getifaddrs_internal () from /lib64/libc.so.6
#7 0x00007fe2df2dd310 in getifaddrs () from /lib64/libc.so.6
#8 0x000000000047c03c in __interceptor_getifaddrs.part.0 ()
操作系统: Red Hat Enterprise Linux Server 7.8版本(Maipo) GLIBC 版本: 2.17
ifaddr
的内容? - Matthieu