您的位置:首页 > 运维架构 > Shell

Understanding Unix/Linux Programming 笔记:chapter 9:可编程的shell、shell变量和环境; chapter 10:I/O重定向和管道

2013-11-03 23:12 901 查看

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/标准输入连接到管道的出口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐