在多线程应用程序中创建套接字文件描述符(sock fd)

时间:2016-11-16 17:36:55

标签: c multithreading sockets

我有一个有两个线程的多线程应用程序。每个线程服务于不同的接口。每当需要通过接口发送消息时,相应的线程就会打开一个套接字(得到一个fd)并发送消息并关闭fd。问题是,当我让两个线程都运行时,套接字没有被重用,我看到fd编号在/ proc // fd内增加。我也可以从日志中验证这一点。

相信问题是线程甚至在另一个线程关闭fd之前请求fd。因此操作系统返回下一个可用的fd编号,并继续这样做。

线程1打开一个tcp套接字,线程2打开一个can(控制器区域网络)套接字

time    thread1      thread2
 0       req fd       idle
 1       fd 1         req fd
 2       close fd1    fd 2
 3       req fd       close fd 2
 4       fd 3         req fd
 5       close fd 3   fd 4

我相信这就是我写下来的样子。我怎样才能确保fd号码不会继续增长?我在ARM处理器上运行32位linux。

2 个答案:

答案 0 :(得分:1)

套接字描述符值中的间隙不是资源泄漏的证据。分配文件描述符是一种线程安全操作(可能与所有系统调用一样)。如果正确关闭每个插座,则不会发生泄漏。

您可以使用以下命令监视打开文件描述符的更改次数:

watch --interval=0.5 "sh -c 'lsof -p YOUR_PROGRAM_PID_HERE | wc -l'"

如果数字增长,那么可能有一些套接字(或其他FD)没有关闭。

如果您仍然不确定是否存在描述符泄漏,您可以尝试通过检查/ proc / self / fd目录中的条目数或者通过检查程序出口处的编程方式计算打开文件描述符的数量反复尝试关闭所有描述符并计算有多少次调用没有返回EBADF错误。如果这个数字每次都不同,则可能存在泄漏。

答案 1 :(得分:0)

原来,在一个条件下的can代码我没有关闭fd!