雖然使用管道可以省去建立臨時(shí)性文件的需求,不過(guò)有時(shí)臨時(shí)性文件還是派得上用場(chǎng)的。linux 不同于其他的操作系統(tǒng)的地方就是:他沒(méi)有那種將不再需要的文件設(shè)法刪除的做法。反倒是提供了兩個(gè)特殊目錄:/tmp
與 /var/tmp
(舊系統(tǒng)是 /usr/tmp
),這些文件可入場(chǎng)被存儲(chǔ),當(dāng)他們未被清理干凈時(shí)也不會(huì)弄亂一般的目錄。大部分系統(tǒng)上的 /tmp
都會(huì)在系統(tǒng)開(kāi)機(jī)時(shí)清理,不過(guò) /var/tmp
下的在重啟時(shí)仍需存在,因?yàn)橛行┪淖志庉嫵绦?,?huì)將他們的備份文件放在這里,從而系統(tǒng)損毀后可以用來(lái)恢復(fù)數(shù)據(jù)。
因?yàn)?/tmp
使用頻繁,有些系統(tǒng)就會(huì)將他們放在常駐內(nèi)存型的文件系統(tǒng)里,以便快速訪問(wèn)。
$df /tmp
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 1032088 262608 717052 27% /
將文件系統(tǒng)放在替換空間 (swap) 區(qū)域里,表示它存在與內(nèi)存中,直到內(nèi)存資源被使用得剩很少時(shí),部分信息才會(huì)寫(xiě)入替換空間。
為確保臨時(shí)性文件會(huì)在任務(wù)完成時(shí)刪除,編譯語(yǔ)言的程序員可以先開(kāi)啟文件,再下達(dá) unlink()
系統(tǒng)調(diào)用。
$$ 變量
使用 $$
變量可以獲取 shell 本身的 PID。
案例:
$echo $$
1736
使用 $$
變量構(gòu)建臨時(shí)性文件名的一部分。要解決完整臨時(shí)性文件名發(fā)生此問(wèn)題的可能性,可使用環(huán)境變量覆蓋目錄名稱,通常是 TMPDIR
。另外,應(yīng)該使用 trap
命令,要求在工作完成時(shí)刪除臨時(shí)性文件。因此,常見(jiàn)的 shell 腳本起始如下:
umask 077 #刪除用戶以外其他人的所有訪問(wèn)權(quán)
TMPFILE=$(TMPDIR-/tmp)/myprog.$$ #產(chǎn)生臨時(shí)文件
trap ‘rm -f $TMPFILE’ EXIT #完成刪除臨時(shí)性文件
mktemp 程序
因?yàn)槭褂?/tmp/myprog.$$
這樣的文件名太好猜了,所以就有了 mktemp
命令。
在進(jìn)行 shell 腳本程序設(shè)計(jì)時(shí),經(jīng)常需要生成臨時(shí)文件,使用 mktemp
命令即可滿足這樣的要求,且保證了文件的安全性。
語(yǔ)法:
mktemp [-qu] [文件名參數(shù)]
有的系統(tǒng)是沒(méi)有 mktemp
命令的,這時(shí)我們需要給 mktemp
打補(bǔ)丁,以使它包含 tempfile
包:
patch -Np1 -i ../mktemp-1.5-add_tempfile-2.patch
編譯 mktemp
:
./configure --prefix=/usr --with-libc
配置選項(xiàng)的含義:
--with-libc
這個(gè)使得 mktemp
程序從系統(tǒng)的 C 庫(kù)中使用 mkstep
和 mkdtemp
的功能。
編譯軟件包:
make
安裝軟件包:
```make install make install-tempfile
**主要參數(shù)**
參數(shù) 作用 -q 執(zhí)行時(shí)若發(fā)生錯(cuò)誤,不會(huì)顯示任何信息 -u 暫存文件會(huì)在 mktemp 結(jié)束前先行刪除 -V 顯示版本信息
案例:
$mktemp tmp.XXX tmp.DSH $ mktemp tmp.XXX tmp.hEc $ mktemp tmp.XXX tmp.7yi
分析:點(diǎn)號(hào)后面的三個(gè)大寫(xiě)字母 XXX 代表了三個(gè)隨機(jī)數(shù)。
$ ll -rw------- 1 root root 0 7 月 12 18:43 tmp.7yi -rw------- 1 root root 0 7 月 12 18:43 tmp.DSH -rw------- 1 root root 0 7 月 12 18:43 tmp.hEc
**`/dev/random` 與 `/dev/urandom` 特殊文件**
這兩個(gè)文件都是用來(lái)產(chǎn)生隨機(jī)數(shù)的。他們產(chǎn)生隨機(jī)數(shù)的原理是利用當(dāng)前系統(tǒng)的熵池來(lái)計(jì)算出一定數(shù)量的隨機(jī)比特,然后將這些比特作為字節(jié)流返回。熵池就是當(dāng)前系統(tǒng)的環(huán)境噪音,熵指的是一個(gè)系統(tǒng)的混亂程度,系統(tǒng)噪音可以通過(guò)很多參數(shù)來(lái)評(píng)估,如內(nèi)存的使用,文件的使用,文件的使用量,不同類型的進(jìn)程數(shù)量等等。如果當(dāng)前環(huán)境噪音變得不是很劇烈或者當(dāng)前環(huán)境噪音很少,日過(guò)剛開(kāi)機(jī)的時(shí)候,而當(dāng)前需要大量的隨機(jī)比特,這時(shí)產(chǎn)生的隨機(jī)數(shù)的隨機(jī)數(shù)效果就不是很好了。
這就是為什么會(huì)有 `/dev/urandom` 和 `/dev/random` 這兩種不同的文件,后者在不能產(chǎn)生新的隨機(jī)數(shù)時(shí)會(huì)阻塞程序,而前者不會(huì) (ublock),當(dāng)然產(chǎn)生的隨機(jī)數(shù)效果就不太好了,這對(duì)加密解密這樣的應(yīng)用來(lái)說(shuō)不是一種很好的選擇。`/dev/random` 會(huì)阻塞當(dāng)前的程序,知道根據(jù)熵池產(chǎn)生新的隨機(jī)字節(jié)之后才返回,所以使用 `/dev/random` 比使用 `/dev/urandom` 產(chǎn)生大量隨機(jī)數(shù)的速度要慢。
案例:
$dd if=/dev/random of=random.dat bs=1024b count=1 記錄了 0+1 的讀入 記錄了 0+1 的寫(xiě)出 128 字節(jié) (128 B) 已復(fù)制,0.000356299 秒,359 kB/ 秒 $ dd if=/dev/urandom of=random.dat bs=1024b count=1 記錄了 1+0 的讀入 記錄了 1+0 的寫(xiě)出 524288 字節(jié) (524 kB) 已復(fù)制,0.226209 秒,2.3 MB/ 秒
分析:`/dev/random` 產(chǎn)生隨機(jī)數(shù)的速度要慢,而且產(chǎn)生的量有限,但是產(chǎn)生隨機(jī)數(shù)的質(zhì)量好。