前几天遇到 fd 泄露问题,这里记录下 fd 查询方法
fd 其实是系统中的文件目录,存在 /proc/[pid]/fd,包含进程打开文件的情况。
打印 fd:
root@android:/ # adb shell ls -l /proc/9580/fd
lrwx------ u0_a96 u0_a96 2017-05-15 16:41 0 -> /dev/null
lrwx------ u0_a96 u0_a96 2017-05-15 16:41 1 -> /dev/null
lrwx------ u0_a96 u0_a96 2017-05-15 16:41 121 -> socket:[23760]
lrwx------ u0_a96 u0_a96 2017-05-15 16:41 122 -> socket:[23329]
lrwx------ u0_a96 u0_a96 2017-05-15 16:41 130 -> socket:[23936]
lrwx------ u0_a96 u0_a96 2017-05-15 16:41 131 -> socket:[23389]
lrwx------ u0_a96 u0_a96 2017-05-15 16:41 132 -> socket:[24398]
lrwx------ u0_a96 u0_a96 2017-05-15 16:41 133 -> socket:[23937]
......
pid 为 9580 的程序 fd 目录下中的每一项都是一个符号链接,指向打开的文件,数字则代表文件描述符
计算个数:
root@android:/ # adb shell ls -l /proc/9580/fd | wc -l
175
写了一个小脚本来打印pid的 fd个数
#!/usr/bin/env python
#!/bin/bash
#!/bin/sh
#coding:utf-8
import os
import sys
if len(sys.argv) == 1:
id = '0'
else:
id = str(sys.argv[1]);
print("pid = " + id)
command = "adb shell ls -l /proc/"+ id +"/fd | wc -l"
print("fd = ")
p = os.system(command)
网友评论