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