我正在试图在linux内核中find它在进程死后清理的地方。 具体来说,我想看看是否/如何处理打开TCP连接后处理-9信号杀死。 我很确定它closures了所有的连接,但我想看看细节,如果有任何连接不正确closures的机会。
指向linux内核源代码是受欢迎的。
使用c,linux中的信号的进程间同步
如果一个进程仍在运行,你如何使用Python检查Linux?
/ proc / PID文件的格式
从c#和mono启动进程时内存不足
进程终止的肉由exit.c:do_exit() 。 这个函数调用exit_files() ,后者又调用了调用put_files_struct() close_files() 。
close_files()循环遍历进程打开的所有文件描述符(包括所有套接字),每个调用fput() ,调用struct file对象上的fput() 。 当对struct file的最后一个引用被放置时, fput()调用文件对象的.release()方法,对于套接字来说,它是net/socket.c的sock_close()函数。
我很确定套接字清理更多的是在进程结束后释放所有文件描述符的副作用,而不是直接由进程清理完成。
尽管如此,我还是会一意孤行,并假设你在网络编程方面遇到了一个常见的陷阱。 如果我正确地猜测你的问题是在进程被终止后试图绑定到一个地址时出现“Address in use”错误(EADDRINUSE),那么你正在运行套接字的TIME_WAIT。
如果是这种情况,您可以等待超时,通常是60秒,或者您可以修改套接字以允许立即重新使用。
int sock,ret,on; struct sockaddr_in servaddr; sock = socket( AF_INET,SOCK_STREAM,0 ): /* Enable address reuse */ on = 1; ret = setsockopt( sock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on) );
[编辑]
从你的意见,这听起来像你有半开连接的问题,并没有完全理解TCP的工作原理。 TCP无法知道客户端是否已经死亡,或只是空闲。 如果你kill -9一个客户端进程,那么四路关闭握手永远不会完成。 这不应该保留在您的服务器上打开连接,所以你仍然可能需要得到一个网络转储,以确定发生了什么事情。
我不能确定你应该如何处理这个,而不知道你在做什么,但是你可以在这里阅读TCP Keepalive 。 其他一些选项是定期向客户端发送空或空消息(可能需要修改协议),或在空闲连接上设置硬定时器(可能导致有效连接中断)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。