套接字(网络或管道)确实有文件描述符。
您可以列出它们:
for (f in File("/proc/self/fd").listFiles()) {
Log.i(TAG, "file : ${f.isFile}, ${f} -> ${f.canonicalPath}")
}
...
file : false, /proc/self/fd/50 -> /dev/kgsl-3d0
file : false, /proc/self/fd/51 -> /proc/2815/fd/51
file : false, /proc/self/fd/52 -> /proc/2815/fd/52
file : false, /proc/self/fd/53 -> /proc/2815/fd/53
file : false, /proc/self/fd/54 -> /proc/2815/fd/54
file : false, /proc/self/fd/55 -> /proc/2815/fd/55
file : false, /proc/self/fd/56 -> /proc/2815/fd/56
file : false, /proc/self/fd/57 -> /dev/ion
file : false, /proc/self/fd/58 -> /dev/ion
file : false, /proc/self/fd/59 -> /dev/hwbinder
file : true, /proc/self/fd/63 -> /data/app/com.google.android.gms-xErOVYdgUuUxSUGYRGwZ0A==/split_config.en.apk
file : true, /proc/self/fd/64 -> /data/app/com.google.android.gms-xErOVYdgUuUxSUGYRGwZ0A==/split_config.xxhdpi.apk
在Android 8.0+(API 26级)上,可以获得更多详细信息:
for (f in File("/proc/self/fd").listFiles()) {
try {
Log.i(TAG, "file : ${f.isFile}, ${f} -> ${java.nio.file.Files.readSymbolicLink(f.toPath())}")
} catch (ex: Exception) {
Log.w(TAG, "Failed to get info for $f")
}
}
...
file : false, /proc/self/fd/50 -> /dev/kgsl-3d0
file : false, /proc/self/fd/51 -> socket:[3647176]
file : false, /proc/self/fd/52 -> socket:[3648033]
file : false, /proc/self/fd/53 -> anon_inode:[eventfd]
file : false, /proc/self/fd/54 -> socket:[3648028]
file : false, /proc/self/fd/55 -> socket:[3648030]
file : false, /proc/self/fd/56 -> anon_inode:[eventpoll]
file : false, /proc/self/fd/57 -> /dev/ion
file : false, /proc/self/fd/58 -> /dev/ion
file : false, /proc/self/fd/59 -> /dev/hwbinder
file : true, /proc/self/fd/63 -> /data/app/com.google.android.gms-xErOVYdgUuUxSUGYRGwZ0A==/split_config.en.apk
file : true, /proc/self/fd/64 -> /data/app/com.google.android.gms-xErOVYdgUuUxSUGYRGwZ0A==/split_config.xxhdpi.apk