Understanding Unix/Linux Programming 筆記:chapter 9:可編程的shell、shell變量和環境; chapter 10:I/O重定向和管道

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/標準輸入連接到管道的出口。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章