如何在c+中使用ping命令和超时停止所有系统调用的顺序释放+;当一条无法到达的路线出现时做的? 我正在研究Linux上C++的应用程序特性,它需要在将CSV文件写入到NAS之前检查NAS的网络连接性。出于测试目的,我使用黑洞路径替换路由可达性,使用: ip -4 route add 172.17.15.17 via 172.17.15.101

如何在c+中使用ping命令和超时停止所有系统调用的顺序释放+;当一条无法到达的路线出现时做的? 我正在研究Linux上C++的应用程序特性,它需要在将CSV文件写入到NAS之前检查NAS的网络连接性。出于测试目的,我使用黑洞路径替换路由可达性,使用: ip -4 route add 172.17.15.17 via 172.17.15.101,c++,linux,ping,system-calls,boost-filesystem,C++,Linux,Ping,System Calls,Boost Filesystem,当我发出上述命令时,NAS路径变得不可访问,但它会对系统产生奇怪的影响。在NAS路径上发出的任何命令(如ls、mkdir,甚至cd)进入NAS目录都会暂停终端会话,只有一条出路,即关闭当前终端会话并打开新的终端会话 首先,我认为在我的C++应用中使用Boost文件系统的ISHEndioTyry-()函数会抛出FielSysMyError异常,称路径是不可到达的,但最终,对于这个情况,甚至没有抛出异常。代码如下: try{ if(boost::filesystem::is_director

当我发出上述命令时,NAS路径变得不可访问,但它会对系统产生奇怪的影响。在NAS路径上发出的任何命令(如ls、mkdir,甚至cd)进入NAS目录都会暂停终端会话,只有一条出路,即关闭当前终端会话并打开新的终端会话

首先,我认为在我的C++应用中使用Boost文件系统的ISHEndioTyry-()函数会抛出FielSysMyError异常,称路径是不可到达的,但最终,对于这个情况,甚至没有抛出异常。代码如下:

try{
    if(boost::filesystem::is_directory(dir) == true){
        boost::filesystem::create_directory(dir);
}
catch(boost::filesystem::filesystem_error &e){
  // write to log traces with LOG_ERR 
}
考虑到这与前面看到的是相同的延迟效果,我开始考虑使用ping实用程序和超时选项进行系统调用以检查可达性,如下所示:

if(system("ping -w2  172.17.15.17") == 0){
    //route is reachable 
    do something ........
}else{
    //route not reachable 
    return;
}
这对我来说很管用,当我注意到一旦我通过发出命令使到NAS的路由可以访问时,我几乎要把它作为最后的代码更改来解决

 ip -4 route del 172.17.15.17 via 172.17.15.101
自从路由无法访问以来,所有失败的ping尝试都被一个接一个地释放

为了更好地理解,让我们假设在5次ping检查后,导致无法找到到NAS的路由,我通过发出上述命令使路由可访问。令我惊讶的是,我看到在/var/log/messages下的日志跟踪中有不止一个ping请求。这就好像ping请求在操作系统缓冲区中的某个位置排队,并在NAS可访问时一个接一个地释放

现在,这在某些情况下可能会起作用,但考虑到NAS连接检查逻辑将频繁发生,当路由变得可访问时,通过系统调用发送的ping请求数量肯定过多

有没有一种方法可以在没有排队影响的情况下,通过系统调用将每次迭代的ping次数限制为一次,或者有更好的方法