作者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