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/标准输入连接到管道的出口。

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