1 背景編程
在Linux socket編程中(相似於《Linux socket編程案例》),服務器使用accept()阻塞模式等待客戶端鏈接,在等待過程當中,使用Ctrl+C來中斷程序(產生SIGINT信號)。因爲但願中斷後先進行一些清理操做(例如釋放內存)再退出程序,使用signal函數來捕獲了SIGINT信號:服務器
signal(SIGINT, App_exit);
說明:App_exit()是自定義的函數,在其中作函數退出清理操做:
static void App_exit(int signo)
{
...
if ( socket_fd != -1) {
close( socket_fd );
socket_fd = -1;
}
...
}
因爲accept()函數使用到socket_fd,而且正在阻塞。因此關閉socket_fd以後出現錯誤:socket
Bad file descriptor
Segmentation fault (core dumped)
2 解決方法
在App_exit()中作清理操做以後,就要結束程序,再也不返回到被中斷處。在App_exit()中的末尾添加_exit()函數便可。函數
_exit(0);
參考資料.net
[1]關於accept被信號中斷的問題線程
[2]C++中如何停止acceptblog
[3]Socket進程處理被中斷的系統調用及Accept函數返回EINTR錯誤處理進程
[4]中斷被Socket.Accept阻塞的線程ip
[5]如何中斷阻塞方式accept調用
---------------------
做者:OneSea-V3.0
來源:CSDN
原文:https://blog.csdn.net/Q1302182594/article/details/46647413
版權聲明:本文爲博主原創文章,轉載請附上博文連接!內存