我们都知道, 在linux中, 任何东西都是以文件形式存在的, 这句话貌似被大家说的太多次了, 下面仅仅举3个例子。
比如, ls命令其实也是个文件, 它对应一个可执行文件, 当敲入ls的时候, 实际上就是运行了该可执行文件, 拉起一个进程, 这个进程读取当前目录下的东东, 然后显示出来。那这个可执行文件对应的源代码是怎样的呢? 熟悉APUE的朋友肯定有印象, 不熟悉APUE的朋友请翻书。
再比如, 在linux设备上插入u盘后, u盘便对应一个挂载目录, 此时应用程序可以直接访问, 所以, 说u盘也是一个文件(目录也可以理解为文件), 毫不为过。 你要是在装Windows的机器上插个u盘, 那应用程序怎么访问呢? 我不知道到, 也没有玩过, 这么看来, Windows有时很恼人。
再再比如, test.txt是个文件, 相信大家肯定没有什么异议了。
千言万语汇成一句话: 在linux中, 文件的含义是广义的, 用一切皆文件来形容也毫不为过。 那么, 怎么查看某个进程打开的文件呢? 用lsof命令吧, 搞linux开发的, 不能不熟悉它。 lsof是list open files的缩写。 我们先看下面这个程序(test.c):
#includeint main() { FILE *fp = fopen("test.txt", "wr"); while(1); return 0; }
编译运行, 得到:
[taoge@localhost learn_c]$ gcc test.c [taoge@localhost learn_c]$ ./a.out
因为程序中有死循环, 所以程序卡住。 我们再次开启另外一个shell终端, 并在其中执行如下命令, 得到如下结果:
[taoge@localhost learn_c]$ lsof | awk '{if(1==NR || "a.out"==$1) print $0}' COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME a.out 2561 taoge cwd DIR 8,2 4096 164029 /home/taoge/Desktop/learn_c a.out 2561 taoge rtd DIR 8,2 4096 2 / a.out 2561 taoge txt REG 8,2 4691 158160 /home/taoge/Desktop/learn_c/a.out a.out 2561 taoge mem REG 8,2 141492 158062 /lib/ld-2.12.so a.out 2561 taoge mem REG 8,2 1855584 158063 /lib/libc-2.12.so a.out 2561 taoge 0u CHR 136,0 0t0 3 /dev/pts/0 a.out 2561 taoge 1u CHR 136,0 0t0 3 /dev/pts/0 a.out 2561 taoge 2u CHR 136,0 0t0 3 /dev/pts/0 a.out 2561 taoge 3w REG 8,2 0 158207 /home/taoge/Desktop/learn_c/test.txt [taoge@localhost learn_c]$
可以看到, 上面就是a.out进程打开的一些文件, 当然, 有的朋友可能对awk不太熟悉, 那行, 我换一个一种方式, 如下:
[taoge@localhost learn_c]$ lsof -c a.out COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME a.out 2561 taoge cwd DIR 8,2 4096 164029 /home/taoge/Desktop/learn_c a.out 2561 taoge rtd DIR 8,2 4096 2 / a.out 2561 taoge txt REG 8,2 4691 158160 /home/taoge/Desktop/learn_c/a.out a.out 2561 taoge mem REG 8,2 141492 158062 /lib/ld-2.12.so a.out 2561 taoge mem REG 8,2 1855584 158063 /lib/libc-2.12.so a.out 2561 taoge 0u CHR 136,0 0t0 3 /dev/pts/0 a.out 2561 taoge 1u CHR 136,0 0t0 3 /dev/pts/0 a.out 2561 taoge 2u CHR 136,0 0t0 3 /dev/pts/0 a.out 2561 taoge 3w REG 8,2 0 158207 /home/taoge/Desktop/learn_c/test.txt [taoge@localhost learn_c]$
可以看到, 结果是一样的。 从上面可知, a.out进程的进程号是2561, 那怎么根据进程号来查看进程打开了哪些文件呢? 且看:
[taoge@localhost learn_c]$ lsof -p 2561 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME a.out 2561 taoge cwd DIR 8,2 4096 164029 /home/taoge/Desktop/learn_c a.out 2561 taoge rtd DIR 8,2 4096 2 / a.out 2561 taoge txt REG 8,2 4691 158160 /home/taoge/Desktop/learn_c/a.out a.out 2561 taoge mem REG 8,2 141492 158062 b/ld-2.12.so a.out 2561 taoge mem REG 8,2 1855584 158063 bbc-2.12.so a.out 2561 taoge 0u CHR 136,0 0t0 3 /dev/pts/0 a.out 2561 taoge 1u CHR 136,0 0t0 3 /dev/pts/0 a.out 2561 taoge 2u CHR 136,0 0t0 3 /dev/pts/0 a.out 2561 taoge 3w REG 8,2 0 158207 /home/taoge/Desktop/learn_c/test.txt [taoge@localhost learn_c]$
说道这里, 我们自然要问, 如何查找某一文件被哪个进程打开呢? 且看:
[taoge@localhost learn_c]$ lsof test.txt COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME a.out 2561 taoge 3w REG 8,2 0 158207 test.txt [taoge@localhost learn_c]$
可见, test.txt被a.out进程打开。