我们都知道, 在linux中, 任何东西都是以文件形式存在的, 这句话貌似被大家说的太多次了, 下面仅仅举3个例子。

比如, ls命令其实也是个文件, 它对应一个可执行文件, 当敲入ls的时候, 实际上就是运行了该可执行文件, 拉起一个进程, 这个进程读取当前目录下的东东, 然后显示出来。那这个可执行文件对应的源代码是怎样的呢? 熟悉APUE的朋友肯定有印象, 不熟悉APUE的朋友请翻书。

再比如, 在linux设备上插入u盘后, u盘便对应一个挂载目录, 此时应用程序可以直接访问, 所以, 说u盘也是一个文件(目录也可以理解为文件), 毫不为过。 你要是在装Windows的机器上插个u盘, 那应用程序怎么访问呢? 我不知道到, 也没有玩过, 这么看来, Windows有时很恼人。

再再比如, test.txt是个文件, 相信大家肯定没有什么异议了。

千言万语汇成一句话: 在linux中, 文件的含义是广义的, 用一切皆文件来形容也毫不为过。 那么, 怎么查看某个进程打开的文件呢? 用lsof命令吧,  搞linux开发的, 不能不熟悉它。 lsof是list open files的缩写。 我们先看下面这个程序(test.c):

#include <stdio.h>int 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进程打开。

linux中的lsof命令简介相关推荐

  1. linux dmesg信息哪来的,linux中的dmesg命令简介

    今天, 我们来介绍一个linux中的dmesg命令,事实上, 我们之前用过, 但是没有单独介绍过. 看一下dmesg命令的用途吧: dmesg命令用会把开机信息存到ring bufer中, 形成一个缓 ...

  2. linux中的ldd命令简介

    在linux中, 有些命令是大家通用的, 比如ls, rm, mv, cp等等, 这些我觉得没有必要再细说了. 而有些命令, 只有开发人员才会用到的, 这类命令, 作为程序员的我们, 是有必要了解的, ...

  3. linux中的strip命令简介------给文件脱衣服

            作为一名linux开发人员, 如果没有听说过strip命令, 那是很不应该的. strip这个单词, 大家应该早就学过了, 你就记住是脱衣服就行了, 别的不要多想. 在linux中, ...

  4. linux中的nm命令简介【转】

    (转自:https://blog.csdn.net/stpeace/article/details/47089585) nm不是ni ma的缩写, 当然, 也不是ni mei的缩写, 而是names的 ...

  5. linux中的nm命令

    代码在git 是names的缩写, nm命令主要是用来列出某些文件中的符号(说白了就是一些函数和全局变量等). 下面, 我们一起来看看. linux中的nm命令简介 nm * nm: main.c: ...

  6. Linux操作系统上lsof命令详解

    Linux操作系统上lsof命令详解 2011-10-08 18:31:31 http://xjsunjie.blog.51cto.com/999372/682865 标签:Linux lsof命令 ...

  7. linux中sed命令用例,Linux中使用sed命令或awk命令修改常规配置文件

    一.方案: Linux中使用sed命令或awk命令修改常规配置文件 二.步骤: 1.假设有一个a.txt,内容如下: #!/bin/bash aa= bbb= ccc= #ddd= 2.如果想要把里面 ...

  8. Python学习之旅:使用Python实现Linux中的ls命令

    一.写在前面 前几天在微信上看到这样一篇文章,链接为:https://mp.weixin.qq.com/s/rl6Sgv3uk_IpoFAx6cWa8w,在这篇文章中,有这样一段话,吸引了我的注意: ...

  9. python中的ls是什么意思_Python学习之旅:使用Python实现Linux中的ls命令

    一.写在前面 在 Linux 中 ls 是一个使用频率非常高的命令了,可选的参数也有很多, 算是一条不得不掌握的命令.Python 作为一门简单易学的语言,被很多人认为是不需要认真学的,或者只是随便调 ...

最新文章

  1. jpa批量删除数据_EXCEL批量删除非数值数据,这么多方法你用哪一个?
  2. Python可视化matplotlib多子图可视化(Multiple Subplots):plt.axes()、plt.subplot()、plt.subplots()、
  3. ThinkPHP的安装
  4. How should I set up tag files for a multi-level directory hierarchy? kiss snow
  5. MUI调用原生自定义方法实现计算缓存与清空缓存
  6. mysql动态sql是什么,mysql中动态sql的一次实际应用
  7. zookeeper基本原理
  8. 深度学习11-tf.data详解以及猫狗图片分类实战
  9. C++关键字 explicit
  10. flex布局——回顾
  11. 七月算法机器学习 9 推荐系统与应用
  12. 卡密社区源码无加密完整版(php源码+mysql脚本)
  13. 工控安全PLC固件逆向二
  14. 点云配准(CloudCompare软件)
  15. 旅行计划 c++_设计旅行计划器
  16. 详谈外部H5页面跳转微信一键关注微信公众号的方案
  17. ANSYS apdl命令流笔记6--------生成线的10种方法
  18. Comet OJ - 2019国庆欢乐赛(赛后整理)
  19. 基于MVC设计(Java Web程序)----图书馆系统
  20. 【1999年分区联赛提高组之一】【图论】【最小点覆盖】【匈牙利】拦截导弹

热门文章

  1. Word一部分内容分为两栏或多栏的方法
  2. 掌握生成对抗网络(GANs),召唤专属二次元老婆(老公)不是梦
  3. “消失”的Android技术博主们现在如何!Android开发者前路在哪?
  4. 9. 【gRPC系列学习】连接失败处理:backoff协议
  5. 汉中至巴中至南充铁路(汉巴南线)顺利开通
  6. 《我不是潘金莲》所揭示的
  7. 低代码开发专题月 | YonBuilder低代码开发平台,企业数智化转型的新动力
  8. 摄像机模型和双目建模三维点云的理解
  9. 读取文件时内容乱码解决方法
  10. 【高等数学笔记】曲面积分的计算