顯示廣告
隱藏 ✕
看板 SuperTree
作者 dick51207 (dick51207.bbs@ptt.cc)
標題 Re: [系程] 教學: 簡介 link, stat, chdir, opendir
時間 2017年08月14日 Mon. PM 08:22:34


※ 本文轉寄自 dick51207.bbs@ptt.cc

看板 b97902HW
作者 LoganChien (簡子翔)
標題 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)
Bingojkt:教學文全消推4@w<1F 04/19 18:16

--
※ 看板: SuperTree 文章推薦值: 0 目前人氣: 0 累積人氣: 48 
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇