看板 SuperTree
作者 標題 Re: [系程] 教學: 簡介 link, stat, chdir, opendir
時間 2017年08月14日 Mon. PM 08:22:34
※ 本文轉寄自 dick51207.bbs@ptt.cc
看板 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: 1Access: (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: 1Access: (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: 2Access: (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: 1Access: (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: 2Access: (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)
推 :教學文全消推4@w<1F 04/19 18:16
--
※ 看板: SuperTree 文章推薦值: 0 目前人氣: 0 累積人氣: 48
回列表(←)
分享