如何查看一个进程打开哪些fd及对应的文件或套接字操作

/*********************************************************************
 * Author  : Samson
 * Date    : 06/22/2015
 * Test platform:
 *              gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
 *              GNU bash, 4.3.11(1)-release (x86_64-pc-linux-gnu)
 * *******************************************************************/

在GNU Linux下使用原生套接字编写了服务端程序与客户端程序,按照常规,服务端程序都是会先创建一个socket并监听此端口的,而客户端程序主要是对服务端的连接,在只开启服务端程序的时候,使用lsof可以看到服务端的所有打开的文件的描述的,服务端程序的进程为29016,如下:

[email protected]:~/socket$ lsof -p 29016

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

oldser 29016 ufo cwd DIR 8,1 4096 2225845 /home/ufo/socket

oldser 29016 ufo rtd DIR 8,1 4096 2 /

oldser 29016 ufo txt REG 8,1 8203 2224940 /home/ufo/socket/oldser

oldser 29016 ufo mem REG 8,1 14768 1442612 /lib/x86_64-linux-gnu/libdl-2.13.so

oldser 29016 ufo mem REG 8,1 1599504 1442606 /lib/x86_64-linux-gnu/libc-2.13.so

oldser 29016 ufo mem REG 8,1 18888 1446570 /lib/x86_64-linux-gnu/liblsp.so

oldser 29016 ufo mem REG 8,1 136936 1442618 /lib/x86_64-linux-gnu/ld-2.13.so

oldser 29016 ufo DEL REG 0,4 0 /SYSVa5723213

oldser 29016 ufo 0u CHR 136,11 0t0 14 /dev/pts/11

oldser 29016 ufo 1u CHR 136,11 0t0 14 /dev/pts/11

oldser 29016 ufo 2u CHR 136,11 0t0 14 /dev/pts/11

oldser 29016 ufo 3u IPv4 550310 0t0 TCP localhost:5555 (LISTEN)

可以看到打开了5555这个端口进行监听;

使用客户端进行连接5555端口后:

[email protected]:~/socket$ lsof -p 29016

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

oldser 29016 ufo cwd DIR 8,1 4096 2225845 /home/ufo/socket

oldser 29016 ufo rtd DIR 8,1 4096 2 /

oldser 29016 ufo txt REG 8,1 8203 2224940 /home/ufo/socket/oldser

oldser 29016 ufo mem REG 8,1 14768 1442612 /lib/x86_64-linux-gnu/libdl-2.13.so

oldser 29016 ufo mem REG 8,1 1599504 1442606 /lib/x86_64-linux-gnu/libc-2.13.so

oldser 29016 ufo mem REG 8,1 18888 1446570 /lib/x86_64-linux-gnu/liblsp.so

oldser 29016 ufo mem REG 8,1 136936 1442618 /lib/x86_64-linux-gnu/ld-2.13.so

oldser 29016 ufo DEL REG 0,4 0 /SYSVa5723213

oldser 29016 ufo 0u CHR 136,11 0t0 14 /dev/pts/11

oldser 29016 ufo 1u CHR 136,11 0t0 14 /dev/pts/11

oldser 29016 ufo 2u CHR 136,11 0t0 14 /dev/pts/11

oldser 29016 ufo 3u IPv4 550310 0t0 TCP localhost:5555 (LISTEN)

oldser 29016 ufo 4u IPv4 550311 0t0 TCP localhost:5555->localhost:39905 (CLOSE_WAIT)

有的时候会出现一个叫name为anon_inode的行,那么这个是什么意思呢?

我在服务端程序里添加了一个epoll后,再次启动服务端程序后,出现了anon_inode这样的fd,如下图:

[email protected]:~/socket$ lsof -p 29381

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

epoll_ser 29381 ufo cwd DIR 8,1 4096 2225845 /home/ufo/socket

epoll_ser 29381 ufo rtd DIR 8,1 4096 2 /

epoll_ser 29381 ufo txt REG 8,1 9830 2229560 /home/ufo/socket/epoll_ser

epoll_ser 29381 ufo mem REG 8,1 14768 1442612 /lib/x86_64-linux-gnu/libdl-2.13.so

epoll_ser 29381 ufo mem REG 8,1 1599504 1442606 /lib/x86_64-linux-gnu/libc-2.13.so

epoll_ser 29381 ufo mem REG 8,1 18888 1446570 /lib/x86_64-linux-gnu/liblsp.so

epoll_ser 29381 ufo mem REG 8,1 136936 1442618 /lib/x86_64-linux-gnu/ld-2.13.so

epoll_ser 29381 ufo DEL REG 0,4 0 /SYSVa5723213

epoll_ser 29381 ufo 0u CHR 136,11 0t0 14 /dev/pts/11

epoll_ser 29381 ufo 1u CHR 136,11 0t0 14 /dev/pts/11

epoll_ser 29381 ufo 2u CHR 136,11 0t0 14 /dev/pts/11

epoll_ser 29381 ufo 3u IPv4 570623 0t0 TCP localhost:5555 (LISTEN)

epoll_ser 29381 ufo 4u 0000 0,9 0 2860 anon_inode

两个客户端连接服务端后:

[email protected]:~/socket$ lsof -p 29381

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

epoll_ser 29381 ufo cwd DIR 8,1 4096 2225845 /home/ufo/socket

epoll_ser 29381 ufo rtd DIR 8,1 4096 2 /

epoll_ser 29381 ufo txt REG 8,1 9830 2229560 /home/ufo/socket/epoll_ser

epoll_ser 29381 ufo mem REG 8,1 14768 1442612 /lib/x86_64-linux-gnu/libdl-2.13.so

epoll_ser 29381 ufo mem REG 8,1 1599504 1442606 /lib/x86_64-linux-gnu/libc-2.13.so

epoll_ser 29381 ufo mem REG 8,1 18888 1446570 /lib/x86_64-linux-gnu/liblsp.so

epoll_ser 29381 ufo mem REG 8,1 136936 1442618 /lib/x86_64-linux-gnu/ld-2.13.so

epoll_ser 29381 ufo DEL REG 0,4 0 /SYSVa5723213

epoll_ser 29381 ufo 0u CHR 136,11 0t0 14 /dev/pts/11

epoll_ser 29381 ufo 1u CHR 136,11 0t0 14 /dev/pts/11

epoll_ser 29381 ufo 2u CHR 136,11 0t0 14 /dev/pts/11

epoll_ser 29381 ufo 3u IPv4 570623 0t0 TCP localhost:5555 (LISTEN)

epoll_ser 29381 ufo 4u 0000 0,9 0 2860 anon_inode

epoll_ser 29381 ufo 5u IPv4 573356 0t0 TCP localhost:5555->localhost:39949 (CLOSE_WAIT)

epoll_ser 29381 ufo 6u IPv4 576894 0t0 TCP localhost:5555->localhost:39950 (CLOSE_WAIT)

查看fd是什么文件或套接字,通过查看FD列及NODE NAME列即可知道对应关系。以上例子可看到FD为3的是IPV4的监听套接字; localhost:5555->localhost:39905 (CLOSE_WAIT)行对应的是FD为4的连接,客户端的端口号为39905,其它依此类推。

说明:

lsof -p 29381

其中29381为服务端程序的进程号。

当然也可以通过以下页面所描述的方法进行查看,但是还是没有lsof方便。

http://blog.csdn.net/itdisciple/article/details/6859507

时间: 2024-10-18 17:52:47

如何查看一个进程打开哪些fd及对应的文件或套接字操作的相关文章

查看一个进程打开的文件都有哪些

step 1 pfile pid step 2 根据 inode number 查找 比如 bash-2.05# pfiles 26053 26053: python Current rlimit: 256 file descriptors 0: S_IFCHR mode:0620 dev:32,0 ino:3982 uid:0 gid:7 rdev:24,2 O_RDWR|O_NOCTTY|O_LARGEFILE 1: S_IFCHR mode:0620 dev:32,0 ino:3982 u

linux 下查看一个进程运行路径

在linux下查看进程大家都会想到用 ps -ef|grep XXX 可是看到的不是全路径,怎么看全路径呢? 每个进程启动之后在 /proc下面有一个于pid对应的路径 例如:ps -ef|grep python 显示:oracle    4431  4366  0 18:56 pts/2    00:00:00 python Server.py 4431就是进程号 到/proc/4431下,ls -l 会看到(需要root权限): 总用量 0 -r--r--r--    1 oracle  

linux 下查看一个进程执行路径

在linux下查看进程大家都会想到用 ps -ef|grep XXX 但是看到的不是全路径.怎么看全路径呢? 每一个进程启动之后在 /proc以下有一个于pid相应的路径 比如:ps -ef|grep python 显示:oracle ? ?4431 ?4366 ?0 18:56 pts/2 ? ?00:00:00 python Server.py 4431就是进程号 到/proc/4431下.ls -l 会看到(须要root权限): 总用量 0 -r--r--r-- ? ?1 oracle ?

Linux 如何查看一个进程的堆栈

有两种方法: 第一种:pstack 进程ID 第二种,使用gdb 然后attach 进程ID,然后再使用命令 thread apply all bt 第三种:strace -f -p pid  该方法和pstack类似 第四中:gcore pid ,输出core文件,gdb cmd corefile 两种方法都可以列出进程所有的线程的当前的调用栈. 不过,使用gdb的方法,还可以查看某些信息,例如局部变量,指针等. 不过,如果只看调用栈的话,pstack还是很方便的. 转自:http://blo

linux如何查看一个进程的堆栈

转自:http://blog.csdn.net/nanjingligong/article/details/8624739 方法一:pstack pidNAME       pstack - print a stack trace of a running process SYNOPSIS       pstack pid DESCRIPTION       pstack  attaches  to  the active process named by the pid on the comm

如何查看一个进程中的某个线程是否存活?

pthread_kill: 别被名字吓到,pthread_kill可不是kill,而是向线程发送signal.还记得signal吗,大部分signal的默认动作是终止进程的运行,所以,我们才要用signal()去抓信号并加上处理函数. int pthread_kill(pthread_t thread, int sig); 向指定ID的线程发送sig信号,如果线程代码内不做处理,则按照信号默认的行为影响整个进程,也就是说,如果你给一个线程发送了SIGQUIT,但线程却没有实现signal处理函数

查看一个进程对应的端口号

一.liunx 下1.查找指定目标项目(atf web工程)进程的pid ps -aux | grep atf root      3582  0.1 11.2 382228 190588 ?       Sl   09:31   0:19 java -Datf -jar start.jar etc/jetty.xml root     22121  0.0  0.0   1644   508 pts/1    R+   12:12   0:00 grep atf 2.在全部端口中查找进程号为

linux下查看一个进程的启动时间和运行时间

使·用 ps命令 :#ps -A -opid,stime,etime,args ps -A -opid,stime,etime,args 结果: root:src# ps -A -opid,stime,etime,args   PID STIME     ELAPSED COMMAND     1 09:21    08:56:14 init [3]                                        2 09:21    08:56:14 [migration/0]

【转】Linux下查看进程打开的文件句柄数

---查看系统默认的最大文件句柄数,系统默认是1024 # ulimit -n 1024 ----查看当前进程打开了多少句柄数 # lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more 131 24204 57 24244 57 24231  ........ 其中第一列是打开的句柄数,第二列是进程ID. 可以根据ID号来查看进程名. # ps aef|grep 24204 nginx 24204 24162 99 16:15 ? 00:24:2