免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 13219 | 回复: 15
打印 上一主题 下一主题

请教进程退出后释放socket的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-08 22:47 |只看该作者 |倒序浏览
50可用积分
假设进程1创建了一些socket,并利用它们建立了一些TCP连接。
此时进程1由于某种原因退出了,内核应该会将此进程的所有资源都释放掉。

我想问的是,对于进程1的这些socket,内核将如何处理?
是直接free掉?还是走正常的关闭TCP连接的流程(发送FIN,等ACK。。。),然后再把它们free掉?

哪位大侠对此比较熟悉,请指点一下!最好能告诉我相关的处理代码在哪儿。
谢谢!

最佳答案

查看完整内容

>>我想问的是,对于进程1的这些socket,内核将如何处理?是直接free掉?还是走正常的关闭TCP连接的流程(发送FIN,等ACK。。。),然后再把它们free掉?走正常的关闭TCP连接的流程,然后再freesys_close->filp_close->sock_close->sock_release->inet_release->tcp_closetcp_close的代码说明了一切

论坛徽章:
0
2 [报告]
发表于 2007-05-08 22:47 |只看该作者
>>我想问的是,对于进程1的这些socket,内核将如何处理?
是直接free掉?还是走正常的关闭TCP连接的流程(发送FIN,等ACK。。。),然后再把它们free掉?

走正常的关闭TCP连接的流程,然后再free

sys_close->filp_close->sock_close->sock_release->inet_release->tcp_close

tcp_close的代码说明了一切

论坛徽章:
0
3 [报告]
发表于 2007-05-08 23:18 |只看该作者

肯定不会直接free掉

你可以关一个程序,再用netstat看一下喽,连接一般会进入time_wait状态。

论坛徽章:
0
4 [报告]
发表于 2007-05-09 08:43 |只看该作者
原帖由 蓝白725 于 2007-5-8 22:47 发表于 1楼  
假设进程1创建了一些socket,并利用它们建立了一些TCP连接。
此时进程1由于某种原因退出了,内核应该会将此进程的所有资源都释放掉。

我想问的是,对于进程1的这些socket,内核将如何处理?
是直接free掉 ...


进程1都退出了,那么系统应该就关机了啊!

论坛徽章:
0
5 [报告]
发表于 2007-05-09 08:53 |只看该作者
原帖由 deepinthesea 于 2007-5-9 08:43 发表于 3楼  


进程1都退出了,那么系统应该就关机了啊!


我只是举一个例子,不是说操作系统的1号进程(它会创建socket吗?呵呵~),就认为是进程A吧。



我想知道,当进程挂了时,内核是立刻将它的进程控制块free掉?还是等它的所有资源都全部释放掉(如:TCP连接全部关闭)后再free进程控制块?

论坛徽章:
0
6 [报告]
发表于 2007-05-09 09:27 |只看该作者
原帖由 蓝白725 于 2007-5-9 08:53 发表于 4楼  


我只是举一个例子,不是说操作系统的1号进程(它会创建socket吗?呵呵~),就认为是进程A吧。



我想知道,当进程挂了时,内核是立刻将它的进程控制块free掉?还是等它的所有资源都全部释放掉(如:T ...


我觉得应该是等待所有资源全部释放掉再free其控制块, 或者由这个进程的父进程来接管去处理这些
资源.
你可以看一看<深入理解Linux内核> 第三章, 专门讲进程的.有进程退出时的操作.

论坛徽章:
0
7 [报告]
发表于 2007-05-09 09:35 |只看该作者
在CU上以前看过一贴关于楼主的问题,只是忘记在哪儿了,楼主可以搜一下

论坛徽章:
0
8 [报告]
发表于 2007-05-09 09:53 |只看该作者
原帖由 qtdszws 于 2007-5-9 09:47 发表于 7楼  
>>我想问的是,对于进程1的这些socket,内核将如何处理?
是直接free掉?还是走正常的关闭TCP连接的流程(发送FIN,等ACK。。。),然后再把它们free掉?

走正常的关闭TCP连接的流程,然后再free

s ...



如果是出现异常,还会走这一流程吗?来得及么?

论坛徽章:
0
9 [报告]
发表于 2007-05-09 09:56 |只看该作者
>>如果是出现异常,还会走这一流程吗?来得及么?

肯定会走,来得及,内核会帮你做,除非内核挂了.

论坛徽章:
0
10 [报告]
发表于 2007-05-09 10:20 |只看该作者
sys_close->filp_close->sock_close->sock_release->inet_release->tcp_close


sys_close是用户进程调用close系统调用后被调用的,内核会在用户进程挂了后自动调它?分别为每一个socket调?


另外,如果是走正常的关闭TCP连接流程的话,那内核在用户进程挂了时就不能立刻将其进程控制块free掉,因为正常的TCP连接关闭是需要其所属进程控制块的。
那也就是说,进程控制块会在所有TCP连接都正常关闭了,所有socket都释放了之后,才被内核free掉?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP