背景
最近遇到一个问题,就是我去绑定8080端口时,发现errno是93(记不清了),表示已经被人用了,于是想去查是哪个进程或者线程。当然我也搜了代码,发现很多以网址的形式出现,还是从linux 系统去看吧。
标准的netstat -pt是可以把进程名显示出来的,但是android版的没有这个选项。
local_port to process_name
$ cat /proc/net/{tcp,udp,unix,raw}
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 0100007F:0019 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 11207 1 0000000000000000 100 0 0 10 0
num = sscanf(line,
“%*d: %32[0-9A-Fa-f]:%X ”
“%32[0-9A-Fa-f]:%X %X ”
“%lX:%lX %*X:%*X ”
“%*X %d %*d %lu “,
local_addr, ¶m->local_port,
rem_addr, ¶m->rem_port, ¶m->state,
¶m->txq, ¶m->rxq,
¶m->uid, ¶m->inode);
local_port = 0x19; inode = 11207;
$ cat /proc/net/unix | grep 136
0000000000000000: 00000003 00000000 00000000 0001 03 13693
0000000000000000: 00000003 00000000 00000000 0001 03 13614
0000000000000000: 00000002 00000000 00000000 0002 01 13692
0000000000000000: 00000002 00000000 00000000 0002 01 13636
for pid = 1860:
$ ls -li /proc/1860/fd/
15271 lrwx—— 1 root root 64 3月 14 22:54 0 -> /dev/null
15272 lrwx—— 1 root root 64 3月 14 22:54 1 -> /dev/null
15273 lrwx—— 1 root root 64 3月 14 22:54 2 -> /dev/null
15274 lrwx—— 1 root root 64 3月 14 22:54 3 -> socket:[13692]
15275 lrwx—— 1 root root 64 3月 14 22:54 4 -> socket:[13693]
15276 lrwx—— 1 root root 64 3月 14 22:54 5 -> anon_inode:[eventfd]
15277 lrwx—— 1 root root 64 3月 14 22:54 6 -> anon_inode:[eventfd]
inode = readlink(i) = {13692,13693}
$ cat /proc/1860/cmdline
/usr/lib/rtkit/rtkit-daemon #name
proc_name to thread_name
需要代码里面调了pthread_setname_np[1]
$ ./a.out
Created a thread. Default name is: a.out
^Z
[1]+ 已停止 ./a.out
H 显示线程 -C ‘a.out bash ps‘ 选择进程名列表
$ ps H -C a.out -o ‘pid tid cmd comm‘
PID TID CMD COMMAND
3437 3437 ./a.out a.out
3437 3438 ./a.out THREADFOO
$ cat /proc/3437/task/3437/comm
a.out
$ cat /proc/3437/task/3438/comm
THREADFOO
然后把上面的用C或shell串起来就可以了。
[1] http://linux.die.net/man/3/pthread_setname_np