亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: [原創(chuàng)]ls與devfs [打印本頁]

作者: woodie    時(shí)間: 2006-06-02 19:00
標(biāo)題: [原創(chuàng)]ls與devfs
前兩天yjh777問了一個(gè)/dev/fd的問題,當(dāng)時(shí)沒搞懂。這兩天琢磨了一下想通了,貼出來供yjh777兄參考:

在較新的linux內(nèi)核中引入了devfs,即/dev,有點(diǎn)類似/proc,它是一種虛擬文件系統(tǒng)。只是在需要時(shí)才動(dòng)態(tài)地生成需要的設(shè)備文件,不像以前不管用不用必須先建好一大堆設(shè)備文件。

/dev/fd/下保存當(dāng)前進(jìn)程用到的文件句柄,對(duì)于不同的用戶,不同的登錄終端,不同的進(jìn)程,使用的文件句柄的指向是不會(huì)一樣的。
執(zhí)行命令
  1. cd /dev/fd
復(fù)制代碼

這樣會(huì)進(jìn)入當(dāng)前shell對(duì)應(yīng)的那一個(gè)“虛擬”的目錄,此時(shí)當(dāng)前的目錄就是當(dāng)前shell對(duì)應(yīng)的devfs中的一個(gè)“凝固的”映像,請(qǐng)記住這一點(diǎn)。
這時(shí)ls -l會(huì)看到當(dāng)前目錄的文件,也就是當(dāng)前的shell所使用的fd。因?yàn)榱谐龅氖且粋(gè)“凝固的”映像的結(jié)果,所以如果使用watch,命令來監(jiān)視的話,結(jié)果是不會(huì)看到任何改變的。

那么命令
  1. ls -l /dev/fd/
復(fù)制代碼

會(huì)列出什么呢?同樣是當(dāng)前進(jìn)程(這里的“當(dāng)前進(jìn)程”是當(dāng)前shell嗎?先想想,答案下面再給出)使用的fd,標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出都是不變的。但是執(zhí)行幾次同樣的命令,你會(huì)發(fā)現(xiàn)有一個(gè)fd的指向卻每次執(zhí)行時(shí)都在變化。
  1. 3 -> /proc/?????/fd
復(fù)制代碼

其中?????代表的數(shù)字也就是一個(gè)進(jìn)程號(hào),在不斷地增大。
實(shí)際上我們隨便看一個(gè)進(jìn)程相應(yīng)的/proc/?????/fd目錄,里面存放的文件就是對(duì)應(yīng)該進(jìn)程使用的文件句柄。
那么我們?cè)傧胂耄琹s -l /dev/fd/命令從何處取得當(dāng)前進(jìn)程的fd呢?我想是打開了/proc/?????/fd文件(這里取文件的廣義含義,嚴(yán)格地說是一個(gè)偽文件系統(tǒng)下的一個(gè)目錄文件),從其中讀取了相應(yīng)的fd。進(jìn)程號(hào)?????對(duì)應(yīng)的進(jìn)程應(yīng)該就是當(dāng)前進(jìn)程 -- ls命令,注意并不是當(dāng)前shell!不過因?yàn)閘s命令繼承了當(dāng)前shell的fd,除了用來讀取fd的句柄fd-3之外,fd-0,fd-1和fd-2與當(dāng)前shell使用的fd指向應(yīng)該是相同的。

OK,讓我們?cè)倏纯疵?br />
  1. watch "ls -l /dev/fd/"
復(fù)制代碼

的顯示。類似下面這樣:
  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
復(fù)制代碼

我們看到:

其中pipe后面的數(shù)字和/proc/后面的數(shù)字是不斷地增大的,為什么?這個(gè)容易理解,watch命令不斷地重新調(diào)用ls命令,新的ls命令的進(jìn)程號(hào)不斷地變大;用來接收ls命令輸出的管道也自然每次都是新的,不過這里的數(shù)字代表什么含義,我還不清楚,知道的大牛請(qǐng)指教!

上面就是目前我對(duì)這個(gè)問題的理解。聲明一下:我沒看過devfs、ls、watch的源碼,所以本貼有很多猜測(cè)的成份,說得不對(duì)的請(qǐng)大家指出。^_^

[ 本帖最后由 woodie 于 2006-6-5 08:38 編輯 ]
作者: woodie    時(shí)間: 2006-06-02 19:04
下面是yjh777兄的原貼:
一個(gè)cd /dev/fd; ls -l 和 ls -l /dev/fd 的問題。
作者: Cygnus    時(shí)間: 2006-06-02 23:28
原帖由 woodie 于 2006-6-2 19:00 發(fā)表
..........
其中pipe后面的數(shù)字和/proc/后面的數(shù)字是不斷地增大的,為什么?這個(gè)容易理解,watch命令不斷地重新調(diào)用ls命令,新的ls命令的進(jìn)程號(hào)不斷地變大;用來接收ls命令輸出的管道也自然每次都是新的,不過這里的數(shù)字代表什么含義,我還不清楚 ...


1 -> pipe:[280311]  

In which 280311 is pipe's kernel buffer size
作者: woodie    時(shí)間: 2006-06-05 11:33
原帖由 Cygnus 于 2006-6-2 23:28 發(fā)表


1 -> pipe:[280311]  

In which 280311 is pipe's kernel buffer size

謝謝您的回貼!不過我還是有點(diǎn)懷疑,一個(gè)是:一個(gè)pipe需要2~3百K的buffer嗎?另外這個(gè)數(shù)字也會(huì)不斷增大。
作者: yjh777    時(shí)間: 2006-06-05 18:11
首先謝謝 woodie 的熱心回復(fù)!

SVR4實(shí)現(xiàn)了全雙工管道,并允許兩個(gè)文件描述符既可以被寫入也可以被讀取。
Linux采用了另外一種解決方法:每個(gè)管道的文件描述符仍然是單向的,但是在
使用一個(gè)描述符之前不必把另外一個(gè)描述符關(guān)閉。

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

[ 本帖最后由 yjh777 于 2006-6-5 18:52 編輯 ]
作者: Cygnus    時(shí)間: 2006-06-05 21:19
原帖由 yjh777 于 2006-6-5 18:11 發(fā)表
... 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 編輯 ]
作者: waker    時(shí)間: 2006-06-06 08:28
美比是 pipe的kernel vfs vnode
不是說一切皆文件么?
作者: Cygnus    時(shí)間: 2006-06-06 08:51
原帖由 waker 于 2006-6-6 08:28 發(fā)表
美比是 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..
作者: r2007    時(shí)間: 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 $
復(fù)制代碼

根據(jù)以上的實(shí)測(cè)
pipe:[3273895]和lsof中的節(jié)點(diǎn)號(hào)是一樣的,難道是巧合?
作者: woodie    時(shí)間: 2006-06-06 10:11
cygnus的建議是對(duì)的,我也用lsof看了下。結(jié)果還是同意waker和r2007的看法,此處應(yīng)該是內(nèi)核vnode。
謝謝各位!
作者: waker    時(shí)間: 2006-06-06 10:15
原帖由 r2007 于 2006-6-6 09:45 發(fā)表
[code]根據(jù)以上的實(shí)測(cè)
pipe:[3273895]和lsof中的節(jié)點(diǎn)號(hào)是一樣的,難道是巧合?

什么是最好的算法?
step1:俺猜x=1是方程的一個(gè)解
step2:將x=1代入方程,兩邊在誤差范圍內(nèi)守恒,所以x=1是方程的一個(gè)有效解

這是俺一直以來的一個(gè)信條
作者: r2007    時(shí)間: 2006-06-06 10:36
原帖由 waker 于 2006-6-6 10:15 發(fā)表

什么是最好的算法?
step1:俺猜x=1是方程的一個(gè)解
step2:將x=1代入方程,兩邊在誤差范圍內(nèi)守恒,所以x=1是方程的一個(gè)有效解

這是俺一直以來的一個(gè)信條[img]http://72891.cn/images/smilies/icon_ ...

我說彩票咋老不中呢,原來是猜得不好
偶愚笨,只會(huì)正面作戰(zhàn)
作者: woodie    時(shí)間: 2006-06-06 11:02
執(zhí)行命令:
  1. watch "{ ls -l /dev/fd/; lsof -d 1,3; }"
復(fù)制代碼

會(huì)看得更清楚些:
  1. Every 2s: { ls -l /dev/fd/; lsof -d 1,3; }              Tue Jun  6 10:53:43 2006

  2. total 0
  3. lrwx------  1 user user 64 2006-06-06 10:53 0 -> /dev/pts/0
  4. l-wx------  1 user user 64 2006-06-06 10:53 1 -> pipe:[7779083]
  5. lrwx------  1 user user 64 2006-06-06 10:53 2 -> /dev/pts/0
  6. lr-x------  1 user user 64 2006-06-06 10:53 3 -> /proc/18299/fd
  7. COMMAND   PID  USER   FD   TYPE DEVICE SIZE    NODE NAME
  8. bash    17936 user    1u   CHR  136,0            2 /dev/pts/0
  9. watch   18261 user    1u   CHR  136,0            2 /dev/pts/0
  10. watch   18261 user    3r  FIFO    0,5      7779083 pipe
  11. sh      18298 user    1w  FIFO    0,5      7779083 pipe
  12. lsof    18300 user    1w  FIFO    0,5      7779083 pipe
  13. lsof    18300 user    3r   DIR    0,2    0       1 /proc
復(fù)制代碼


我的環(huán)境是debian sarge,kernel 2.4.27。cygnus兄的環(huán)境也許不同。^_^
作者: yjh777    時(shí)間: 2006-06-06 18:02
謝謝各位大俠!
man lsof
  NODE       is the node number of a local file;

                  or the inode number of an NFS file in the server host;

                  or the Internet protocol type - e. g, ``TCP'';

                  or ``STR'' for a stream;

                  or ``CCITT'' for an HP-UX x.25 socket;

                  or the IRQ or inode number of a Linux AX.25 socket device.


/dev/fd是指向/proc/self/fd的一個(gè)連接,而/proc/self又動(dòng)態(tài)的指向當(dāng)前程序的信息目錄/proc/??????/

ls /dev/fd/看到的是當(dāng)前l(fā)s進(jìn)程本身打開的文件信息。
cd /dev/fd 也是進(jìn)到當(dāng)前cd進(jìn)程本身對(duì)應(yīng)的 /proc/$cd's_PID/fd中。。。
作者: Cygnus    時(shí)間: 2006-06-07 10:29
原帖由 woodie 于 2006-6-6 10:11 發(fā)表
cygnus的建議是對(duì)的,我也用lsof看了下。結(jié)果還是同意waker和r2007的看法,此處應(yīng)該是內(nèi)核vnode。
謝謝各位!


請(qǐng)恕老夫眼拙了. 君不見 size 與 node 在 lsof 的輸出中乃是 side by side 嗎.
對(duì)由此而引起的誤導(dǎo)表示極度之遺憾.  哈哈.
作者: r2007    時(shí)間: 2006-06-07 11:50
原帖由 Cygnus 于 2006-6-7 10:29 發(fā)表


請(qǐng)恕老夫眼拙了. 君不見 size 與 node 在 lsof 的輸出中乃是 side by side 嗎.
對(duì)由此而引起的誤導(dǎo)表示極度之遺憾.  哈哈.


我說呢,還以為pipe后面的數(shù)據(jù)在不同的系統(tǒng)有不同的解釋呢。謝謝Cygnus的再次驗(yàn)證。
作者: yjh777    時(shí)間: 2006-06-07 12:53
以前用的 ls -il 看到的是看的是符號(hào)連接文件本身的inode號(hào),加L選項(xiàng)就可以看出來了。

watch "ls -ilL /dev/fd/"




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2