免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4793 | 回复: 16
打印 上一主题 下一主题

[原创]ls与devfs  关闭 [复制链接]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-02 19:00 |只看该作者 |倒序浏览
前两天yjh777问了一个/dev/fd的问题,当时没搞懂。这两天琢磨了一下想通了,贴出来供yjh777兄参考:

在较新的linux内核中引入了devfs,即/dev,有点类似/proc,它是一种虚拟文件系统。只是在需要时才动态地生成需要的设备文件,不像以前不管用不用必须先建好一大堆设备文件。

/dev/fd/下保存当前进程用到的文件句柄,对于不同的用户,不同的登录终端,不同的进程,使用的文件句柄的指向是不会一样的。
执行命令
  1. cd /dev/fd
复制代码

这样会进入当前shell对应的那一个“虚拟”的目录,此时当前的目录就是当前shell对应的devfs中的一个“凝固的”映像,请记住这一点。
这时ls -l会看到当前目录的文件,也就是当前的shell所使用的fd。因为列出的是一个“凝固的”映像的结果,所以如果使用watch,命令来监视的话,结果是不会看到任何改变的。

那么命令
  1. ls -l /dev/fd/
复制代码

会列出什么呢?同样是当前进程(这里的“当前进程”是当前shell吗?先想想,答案下面再给出)使用的fd,标准输入、标准输出和标准错误输出都是不变的。但是执行几次同样的命令,你会发现有一个fd的指向却每次执行时都在变化。
  1. 3 -> /proc/?????/fd
复制代码

其中?????代表的数字也就是一个进程号,在不断地增大。
实际上我们随便看一个进程相应的/proc/?????/fd目录,里面存放的文件就是对应该进程使用的文件句柄。
那么我们再想想,ls -l /dev/fd/命令从何处取得当前进程的fd呢?我想是打开了/proc/?????/fd文件(这里取文件的广义含义,严格地说是一个伪文件系统下的一个目录文件),从其中读取了相应的fd。进程号?????对应的进程应该就是当前进程 -- ls命令,注意并不是当前shell!不过因为ls命令继承了当前shell的fd,除了用来读取fd的句柄fd-3之外,fd-0,fd-1和fd-2与当前shell使用的fd指向应该是相同的。

OK,让我们再看看命令
  1. watch "ls -l /dev/fd/"
复制代码

的显示。类似下面这样:
  1. lrwx------  1 user user 64  6  2 18:17 0 -> /dev/null
  2. l-wx------  1 user user 64  6  2 18:17 1 -> pipe:[280311]
  3. lrwx------  1 user user 64  6  2 18:17 2 -> /dev/pts/0
  4. lr-x------  1 user user 64  6  2 18:17 3 -> /proc/22698/fd
复制代码

我们看到:
  • 标准输入被重定向到/dev/null,说明ls命令不用接受键盘输入。
  • 标准输出指向一个管道文件,可以想见,ls命令的输出通过管道交由watch命令处理。
  • 标准错误输出没有重定向,仍然指向我们远程登录的终端。
  • fd-3指向文件/proc/22698/fd,我们在上面已经解释过了。

其中pipe后面的数字和/proc/后面的数字是不断地增大的,为什么?这个容易理解,watch命令不断地重新调用ls命令,新的ls命令的进程号不断地变大;用来接收ls命令输出的管道也自然每次都是新的,不过这里的数字代表什么含义,我还不清楚,知道的大牛请指教!

上面就是目前我对这个问题的理解。声明一下:我没看过devfs、ls、watch的源码,所以本贴有很多猜测的成份,说得不对的请大家指出。^_^

[ 本帖最后由 woodie 于 2006-6-5 08:38 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2006-06-02 19:04 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2006-06-02 23:28 |只看该作者
原帖由 woodie 于 2006-6-2 19:00 发表
..........
其中pipe后面的数字和/proc/后面的数字是不断地增大的,为什么?这个容易理解,watch命令不断地重新调用ls命令,新的ls命令的进程号不断地变大;用来接收ls命令输出的管道也自然每次都是新的,不过这里的数字代表什么含义,我还不清楚 ...


1 -> pipe:[280311]  

In which 280311 is pipe's kernel buffer size

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2006-06-05 11:33 |只看该作者
原帖由 Cygnus 于 2006-6-2 23:28 发表


1 -> pipe:[280311]  

In which 280311 is pipe's kernel buffer size

谢谢您的回贴!不过我还是有点怀疑,一个是:一个pipe需要2~3百K的buffer吗?另外这个数字也会不断增大。

评分

参与人数 1可用积分 +1 收起 理由
waker + 1

查看全部评分

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
5 [报告]
发表于 2006-06-05 18:11 |只看该作者
首先谢谢 woodie 的热心回复!

SVR4实现了全双工管道,并允许两个文件描述符既可以被写入也可以被读取。
Linux采用了另外一种解决方法:每个管道的文件描述符仍然是单向的,但是在
使用一个描述符之前不必把另外一个描述符关闭。

that num may be pipe's fd(file descriptor)

[ 本帖最后由 yjh777 于 2006-6-5 18:52 编辑 ]

评分

参与人数 1可用积分 +1 收起 理由
waker + 1

查看全部评分

论坛徽章:
0
6 [报告]
发表于 2006-06-05 21:19 |只看该作者
原帖由 yjh777 于 2006-6-5 18:11 发表
... that num may be pipe's fd(file descriptor) ...


Oh no.

How about to run lsof to check what it is. Thanks.

[ 本帖最后由 Cygnus 于 2006-6-5 21:28 编辑 ]

评分

参与人数 1可用积分 +1 收起 理由
waker + 1

查看全部评分

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
7 [报告]
发表于 2006-06-06 08:28 |只看该作者
美比是 pipe的kernel vfs vnode
不是说一切皆文件么?

论坛徽章:
0
8 [报告]
发表于 2006-06-06 08:51 |只看该作者
原帖由 waker 于 2006-6-6 08:28 发表
美比是 pipe的kernel vfs vnode
不是说一切皆文件么?


Don't guess !

PLEASE run lsof to get all needed information for pipes.
You may have to read some documents to understand the details
of lsof output for special objects such as socket, pipe, etc..

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
9 [报告]
发表于 2006-06-06 09:45 |只看该作者
  1. r2007@www fd $ (ls -l /dev/fd/;lsof -d 0-9)|cat
  2. total 0
  3. lrwx------    1 r2007    users          64 Jun  6 08:46 0 -> /dev/pts/0
  4. l-wx------    1 r2007    users          64 Jun  6 08:46 1 -> pipe:[3273895]
  5. lrwx------    1 r2007    users          64 Jun  6 08:46 2 -> /dev/pts/0
  6. lr-x------    1 r2007    users          64 Jun  6 08:46 3 -> /proc/29222/fd
  7. COMMAND   PID  USER   FD   TYPE DEVICE SIZE       NODE NAME
  8. bash    22459 r2007    0u   CHR  136,0             802 /dev/pts/0
  9. bash    22459 r2007    1u   CHR  136,0             802 /dev/pts/0
  10. bash    22459 r2007    2u   CHR  136,0             802 /dev/pts/0
  11. bash    29220 r2007    0u   CHR  136,0             802 /dev/pts/0
  12. bash    29220 r2007    1w  FIFO    0,5         3273895 pipe
  13. bash    29220 r2007    2u   CHR  136,0             802 /dev/pts/0
  14. cat     29221 r2007    0r  FIFO    0,5         3273895 pipe
  15. cat     29221 r2007    1u   CHR  136,0             802 /dev/pts/0
  16. cat     29221 r2007    2u   CHR  136,0             802 /dev/pts/0
  17. lsof    29223 r2007    0u   CHR  136,0             802 /dev/pts/0
  18. lsof    29223 r2007    1w  FIFO    0,5         3273895 pipe
  19. lsof    29223 r2007    2u   CHR  136,0             802 /dev/pts/0
  20. lsof    29223 r2007    3r   DIR    0,2    0          1 /proc
  21. lsof    29223 r2007    4r   DIR    0,2    0 1915158536 /proc/29223/fd
  22. lsof    29223 r2007    5w  FIFO    0,5         3273915 pipe
  23. lsof    29223 r2007    6r  FIFO    0,5         3273916 pipe
  24. lsof    29224 r2007    4r  FIFO    0,5         3273915 pipe
  25. lsof    29224 r2007    7w  FIFO    0,5         3273916 pipe
  26. r2007@www fd $
复制代码

根据以上的实测
pipe:[3273895]和lsof中的节点号是一样的,难道是巧合?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
10 [报告]
发表于 2006-06-06 10:11 |只看该作者
cygnus的建议是对的,我也用lsof看了下。结果还是同意waker和r2007的看法,此处应该是内核vnode。
谢谢各位!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP