作者LoganChien (簡子翔)
看板b97902HW
標題Re: [系程] 教學: 簡介 link, stat, chdir, opendir
時間Sun Apr 11 04:45:23 2010
簡介 link, stat, chdir, opendir
我們在上一篇得到了不少檔案系統的基本概念了!不過在我介紹 link,
stat, chdir, opendir 等 API 之前,我先介紹一下一些相關的指令。
相關指令
我第一個想要介紹的指令是 ln 與 unlink。這二個指令分別是用來建立
與刪除一個 Link。他們的使用方式如下:
ln [
-s] 目標路徑 檔案連結
unlink 檔案連結路徑
對與 ln 指令,我們可選擇我們要建立的連結是
Symbolic Link 還是
Hard Link。例如:
$
echo content > test.txt
$
ls -al
總計 12
drwxr-xr-x 2 logan logan 4096 2010-04-11 03:43 .
drwxr-xr-x 5 logan logan 4096 2010-04-11 03:42 ..
-rw-r--r--
1 logan logan 8 2010-04-11 03:43 test.txt
# 我們可以看到,只有 test.txt 這一個 Hard Link 指向那個 inode,
# 而指向這個目錄的 inode 的 Hard Link 有二個。另外我們可以注
# 意到:test.txt 的檔案大小是 8bytes。
$
ln test.txt test2.txt
# 建立一個新的 Hard Link
$
ls -al
總計 16
drwxr-xr-x 2 logan logan 4096 2010-04-11 03:47 .
drwxr-xr-x 5 logan logan 4096 2010-04-11 03:42 ..
-rw-r--r--
2 logan logan 8 2010-04-11 03:43 test2.txt
-rw-r--r--
2 logan logan 8 2010-04-11 03:43 test.txt
# 我們可以注意到 test.txt 與 test2.txt 指向的 inode 其 st_nlink
# 的值都是 2。而且二個檔案的大小都是 8bytes。
$
unlink test.txt
# 我們可以用 unlink 去除 test.txt 這一個 Hard Link。我們會發
# 現為一個檔案建立一個新的 Hard Link 再使用 unlink,其效果類
# 似 rename。
$
ls -al
總計 12
drwxr-xr-x 2 logan logan 4096 2010-04-11 03:57 .
drwxr-xr-x 5 logan logan 4096 2010-04-11 03:42 ..
-rw-r--r-- 1 logan logan 8 2010-04-11 03:50 test2.txt
$
cat test2.txt
content
$
ln -s test2.txt test3.txt
# 嘗試建立 Symbolic Link
$
ls -al
總計 12
drwxr-xr-x 2 logan logan 4096 2010-04-11 04:00 .
drwxr-xr-x 5 logan logan 4096 2010-04-11 03:42 ..
-rw-r--r--
1 logan logan 8 2010-04-11 03:50 test2.txt
lrwxrwxrwx
1 logan logan 9 2010-04-11 04:00
test3.txt -> test2.txt
# 我們可以注意到:Symbolic Link 的顯示方式與 Hard Link 的顯
# 示方式略有不同。而且二者的 st_nlink 似乎都只有 1。另外,
# Symbolic Link 的檔案大小也不同!似乎剛好就是 "test2.txt"
# 這一個字串的長度。我們再看一個例子:
$
ln -s /home/logan/桌面/tutorial/test2.txt test4.txt
$
ls -al
總計 12
drwxr-xr-x 2 logan logan 4096 2010-04-11 04:05 .
drwxr-xr-x 5 logan logan 4096 2010-04-11 03:42 ..
-rw-r--r-- 1 logan logan 8 2010-04-11 03:50 test2.txt
lrwxrwxrwx 1 logan logan 9 2010-04-11 04:00 test3.txt -> test2.txt
lrwxrwxrwx 1 logan logan
37 2010-04-11 04:05 test4.txt -> /home/logan/桌面
/tutorial/test2.txt
如果一個檔案只剩一個 Hard Link,這個檔案還被 unlink 會怎樣?
$
unlink test2.txt
$
ls -al
總計 8
drwxr-xr-x 2 logan logan 4096 2010-04-11 04:08 .
drwxr-xr-x 5 logan logan 4096 2010-04-11 03:42 ..
lrwxrwxrwx 1 logan logan 9 2010-04-11 04:00 test3.txt -> test2.txt
lrwxrwxrwx 1 logan logan 37 2010-04-11 04:05 test4.txt -> /home/logan/桌面
/tutorial/test2.txt
# 我們可以注意到:test2.txt 好像就消失了!他的效果和 remove
# 很像!事實上,只要一個檔案其 st_nlink 變成 0 其空間會被回收。
# 我們再看一個比較大的檔案:
$
dd if=/dev/zero of=test.dat bs=4096 count=25600
$
df | grep "/home"
/dev/sda7 39373712
13972728 23400896 38% /home
$
unlink test.dat
$
df | grep "/home"
/dev/sda7 39373712
13870324 23503300 38% /home
# 相差接近 102400kb!
接下來我們來試試其怪的 link:
$
ln -s test5.txt test5.txt
$
cat test5.txt
cat: test5.txt: Too many levels of symbolic links
$
touch test6_16
$
for i in {0..15}; do j=`echo $i+1|bc`; ln -s test6_$j test6_$i; done
$
ls -al
lrwxrwxrwx 1 logan logan 7 2010-04-11 04:30 test6_0 -> test6_1
lrwxrwxrwx 1 logan logan 7 2010-04-11 04:30 test6_1 -> test6_2
lrwxrwxrwx 1 logan logan 8 2010-04-11 04:30 test6_10 -> test6_11
lrwxrwxrwx 1 logan logan 8 2010-04-11 04:30 test6_11 -> test6_12
lrwxrwxrwx 1 logan logan 8 2010-04-11 04:30 test6_12 -> test6_13
lrwxrwxrwx 1 logan logan 8 2010-04-11 04:30 test6_13 -> test6_14
lrwxrwxrwx 1 logan logan 8 2010-04-11 04:30 test6_14 -> test6_15
lrwxrwxrwx 1 logan logan 8 2010-04-11 04:30 test6_15 -> test6_16
-rw-r--r-- 1 logan logan 0 2010-04-11 04:30 test6_16
lrwxrwxrwx 1 logan logan 7 2010-04-11 04:30 test6_2 -> test6_3
lrwxrwxrwx 1 logan logan 7 2010-04-11 04:30 test6_3 -> test6_4
lrwxrwxrwx 1 logan logan 7 2010-04-11 04:30 test6_4 -> test6_5
lrwxrwxrwx 1 logan logan 7 2010-04-11 04:30 test6_5 -> test6_6
lrwxrwxrwx 1 logan logan 7 2010-04-11 04:30 test6_6 -> test6_7
lrwxrwxrwx 1 logan logan 7 2010-04-11 04:30 test6_7 -> test6_8
lrwxrwxrwx 1 logan logan 7 2010-04-11 04:30 test6_8 -> test6_9
lrwxrwxrwx 1 logan logan 8 2010-04-11 04:30 test6_9 -> test6_10
$
cat test6_8 # ok
$
cat test6_7 # ELOOP
接下來我要談的是最後一個指令:
stat。我們可以用 stat 指令來看
一個檔案的 inode 的相關資訊。使用方法如下:
stat 檔案路徑
例如:
$
stat test5.txt
File: `test5.txt' -> `test5.txt'
Size: 9 Blocks: 0 IO Block: 4096
symbolic link
Device: 807h/2055d Inode:
925583 Links:
1
Access: (0777/lrwxrwxrwx) Uid: (
1000/
logan) Gid: ( 1000/ logan)
Access:
2010-04-11 04:12:21.961974851 +0800
Modify:
2010-04-11 04:12:20.741974396 +0800
Change:
2010-04-11 04:12:20.741974396 +0800
# 使用 stat 指令,我們可以看到一個檔案的 st_ino,st_nlink,
# 檔案的種類,UID,Access Time 與 Modify Time。
$
stat test6_16
File: `test6_16'
Size: 0 Blocks: 0 IO Block: 4096
regular empty file
Device: 807h/2055d Inode: 925592 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ logan) Gid: ( 1000/ logan)
Access: 2010-04-11 04:31:54.541996399 +0800
Modify: 2010-04-11 04:30:02.580974470 +0800
Change: 2010-04-11 04:30:02.580974470 +0800
# 這是一個 regular file 的範例
$
stat .
File: `.'
Size: 4096 Blocks: 8 IO Block: 4096
directory
Device: 807h/2055d Inode: 925582 Links:
2
Access: (0755/
drwxr-xr-x) Uid: ( 1000/ logan) Gid: ( 1000/ logan)
Access: 2010-04-11 04:30:13.885998161 +0800
Modify: 2010-04-11 04:30:12.704972352 +0800
Change: 2010-04-11 04:30:12.704972352 +0800
# 這是一個 directory 的範例
$
ln -s . rec
$
stat rec
File: `rec' -> `.'
Size: 1 Blocks: 0 IO Block: 4096
symbolic link
Device: 807h/2055d Inode: 925609 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 1000/ logan) Gid: ( 1000/ logan)
Access: 2010-04-11 04:38:55.788996368 +0800
Modify: 2010-04-11 04:38:55.788996368 +0800
Change: 2010-04-11 04:38:55.788996368 +0800
# 這是一個 symbolic link 的範例,我直接把 rec 這個 symbolic
# link 指向 " . "
$
ln test6_16 test6_16-2
$
stat test6_16-2
File: `test6_16-2'
Size: 0 Blocks: 0 IO Block: 4096
regular empty file
Device: 807h/2055d Inode: 925592 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 1000/ logan) Gid: ( 1000/ logan)
Access: 2010-04-11 04:31:54.541996399 +0800
Modify: 2010-04-11 04:30:02.580974470 +0800
Change: 2010-04-11 04:40:21.604996580 +0800
# 這個範例是想要展示 stat 指令會怎麼處理一個 hard link。
# 我們可以看到 stat 指令是直接看那個檔案的 inode 資訊,
# 所以既然 Hard Link 的 inode 一樣,顯示的結果也會一樣。
怎麼好像寫了半天還是文不對題? ...
未完.待續
--
LoganChien ----- from PTT2 個板 logan -----
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.224.97.11
※ 編輯: LoganChien 來自: 61.224.97.11 (04/11 04:51)
1F:推 Bingojkt:教學文全消推4@w< 04/19 18:16