如何处理永远不会执行的代码

我有一些看起来像这样的代码,我不确定如何处理永远不会被执行的部分,因为这段代码的一部分在等待连接时运行在无限循环中,当我终止程序时,它只从那里退出。

main(){ // do some stuff.... while(1) { int newFD = accept(sockFD, (struct sockaddr *)&client_addr, &client_addr_size); if(newFD == -1) { std::cerr << "Error while Accepting on socket" << std::endl; continue; } if(!fork()) { close(sockFD); // close child's sockfd - not needed here // lalala do stuff send message here close(newFD); // finally close its newFD - message sent, no use return 0; } close(newFD); // close parent's newFD - no use here } // now execution never reaches here close(sockFD); // so how to handle this? freeaddrinfo(res); // and this? return 0; } 

你可以,也许应该添加一个退出处理程序,如果你的代码被其他人使用,或者你自己只是希望它更干净。 在退出处理程序中,可以切换使while()循环终止的标志。 下面的代码对于这个用例可以100%的正常工作,并且是可靠的,跨平台的,但是如果你想做更复杂的事情,你应该使用适当的线程安全的操作系统特定的函数,或者像Boost或者C ++ 11

首先声明两个全局变量,使它们变化,这样编译器总是会强制我们读取或写入其实际的内存值。 如果我们不声明它是volatile的,那么编译器可能会把它的值放在一个寄存器里,这样做会不起作用。 随着易失性设置它将读取每个循环的内存位置,并正常工作,即使有多个线程。

 volatile bool bRunning=true; volatile bool bFinished=false; 

而不是你的while(1) {}循环,将其更改为此

 while(bRunning) { dostuff } bFinished=true; 

在你的退出处理程序简单地设置bRunning=false;

 void ExitHandler() { bRunning=false; while(bFinished==false) { Sleep(1); } } 

你没有指定一个操作系统,但它看起来像你是基于Linux的,在Linux上设置一个处理程序,你需要这个。

 void ExitHandler(int s) { bRunning=false; } int main() { struct sigaction sigIntHandler; sigIntHandler.sa_handler = ExitHandler; sigemptyset(&sigIntHandler.sa_mask); sigIntHandler.sa_flags = 0; sigaction(SIGINT, &sigIntHandler, NULL); while(bRunning) { dostuff } ...error_handling... } 

而在Windows上,当你是一个控制台应用程序以下。

 BOOL WINAPI ConsoleHandler(DWORD CEvent) { switch (CEvent) { case CTRL_C_EVENT: case CTRL_BREAK_EVENT: case CTRL_CLOSE_EVENT: case CTRL_LOGOFF_EVENT: case CTRL_SHUTDOWN_EVENT: bRunning = false; while (bFinished == false) Sleep(1); break; } return TRUE; } int main() { SetConsoleCtrlHandler(ConsoleHandler, TRUE); while(bRunning() { dostuff } ...error_handling... } 

注意需要测试并等待在这里完成。 如果您不在Windows上执行此操作,您的应用程序可能没有足够的时间关闭,因为退出处理程序是由单独的操作系统特定的线程调用的。 在Linux上这是不必要的,你需要退出你的处理程序为您的主线程继续。

另外需要注意的是,默认情况下,Windows在关闭之前只会让你关闭5秒钟。 这在许多情况下是不幸的,如果需要更多的时间,您将需要更改注册表设置(坏主意)或实施更好地挂钩到这样的事情的服务。 对于你的简单情况,它会没事的。

对于这些事情,操作系统将负责在关机时正确释放资源。 但是,更一般的情况是,即使程序执行过程中被分配的资源自动被操作系统回收,也仍然需要确保分配的资源不会堆积,因为这样的资源泄漏仍然会影响程序的行为和性能。

现在,关于手头的资源,没有理由不把它们当作C ++中的所有资源来对待。 被接受的规则是将它们绑定到一个将在析构函数中释放它们的对象,另请参阅RAII成语。 这样,即使在稍后阶段某人添加了一个break语句,代码仍然会正确运行。

顺便说一句:我看到的更严重的问题是缺乏一般的错误处理。