Linux下Socket资源被继承的解决方法
问题
最近在写一个小的TCP服务器,由于一些莫名其妙的原因老是崩溃。于是就想着建立一个自动恢复机制。自动恢复跑起来之后发现服务器绑定地址的时候会报错“Address already in use!”(他喵的-_-!!)。
定位
针对问题百度了一下,很多帖子说是由于socket关闭之后要等待一个TIME_WAIT的时间,新申请socket的时候,把SO_REUSEADDR选项设置一下就能够解决。
说的有道理,试一下,没用。。。
定位x2
用命令netstat -anp看了下,发现我的服务器端口,在进程崩溃之后被别的进程继承了,所以等死他也不不会释放出来。。。
Linux进程资源继承问题
之前在做别的项目时,其实碰到过类似的问题。笼统点说,就是父进程退出(或者崩溃)的时候,他的软件资源(文件句柄,socket等)会被子进程继承。我这边没有搜索更正式的文档,感兴趣的同学可以自行百度一下。
解决
知道原因就好解决了,搜索一下,在stackoverflow找到一个同样的问题,链接:https://stackoverflow.com/questions/28900184/avoid-socket-inheritance-when-starting-linux-service-from-c-application。
提问截图如下: