Chapter 9
UnderstandingUnix/Linux Programming 筆記:chapter 9:可編程的shell、shell變量和環境:編寫自己的shell
Key-word:
本章繼續完善上章的shell。新添加的功能:1)命令行解析;2)if-then-else-if流程控制;3)加入局部變量和環境變量
都是通過C函數實現,沒有用到新的系統函數調用。
Chapter 10
UnderstandingUnix/Linux Programming 筆記:chapter 10:I/O重定向和管道
Key-word: pipe,dup
基本概念:
1)
所有的Unix工具都使用文件描述符0、1和2,分別對應:標準輸入、標準輸出和標準錯誤輸出,默認的這三個文件描述符都是連接終端。
2)
當打開文件時,爲此文件安排的描述符總是此數組中最低可用位置的索引(即序號最低的文件描述符)。
3)I/O重定向示例
I/O重定向就是將Unix工具的0, 1或2文件描述符與指定的文件連接。
如以下代碼:
…
close(0);
fd = open(“/etc/passwd”, O_RDONLY);
…
close(0)將關閉文件描述符0與終端的連接,在打開文件passwd時,由於(2)所述,0就是最低的可用位置索引,因此文件描述符0會指向fd。從而使該段程序的輸入從終端變爲了文件passwd。
內容概要:
1)將0定向到文件,即從該文件輸入
默認的0是連接到終端的,如何將其定向到文件,例如如何實現sort<data ?
方法一:如上述示例,使用:close-then-open策略。
方法二:open-close-dup-close
第一步:先調用open(file),open要重定向的文件,這個調用返回一個文件描述符fd,這個描述符並不是0,因爲0在當前已經被打開了;
第二步:調用close(0),關閉文件描述符0與終端的連接;
第三步:調用dup(fd),複製第一步得到的文件描述符,因爲第二步已經將文件描述法0與終端的連接關閉,因此文件描述法0此時空閒;又由於上述2),獲得的文件描述符是0.此時,磁盤文件就與文件描述符連接在一起了,當然此時磁盤文件也還與fd連接在一起;
第四步:關閉第一步中得到的文件描述符fd。
方法三:open-dup2-colse
dup2命令同時實現了方法二中的close和dup。
2)將1定向到文件,即輸出到文件
例如如何實現who>userlist ?
類似於上述方法一,只是關閉1,使用close(1)。
3)管道編程
實現將一個進程的輸出和另一個進程的輸入連接。例如如何實現who|sort?
pipe用於創建管道並將其兩端連接到兩個文件描述符。相當於建了一個管子,一端/一個文件描述符進,一端出。
要實現who|sort,先調用pipe建立管道,調用fork建立子進程;在子進程程中,將who的1/標準輸出連接到管道的入口;在父進程中將sort的0/標準輸入連接到管道的出口。