一 shell编程
- comm命令:比较两个文件是否相等
二 IO重定向
1-基础
- 很多Unix命令都被称为Unix工具
- 一个进程(一个使用中的命令)都会产生一个存放文件描述符的数组,该数组中的下标就是文件描述符的号,0,1,2三位是进程的标准输入输出和错误流(进程接收0位的输入,从1位输出)。
- 最低可用文件描述符原则
2-将进程的标准输入重定向到文件
- 进程的标准输入默认是连接终端的
- 关闭0原本的管道;
- 打开文件,文件描述符自动赋为0
- dup函数和dup2函数
3-将命令的输出重定向到文件
- fork()出子进程之后,在子进程中关闭原始的文件描述符1,然后打开新文件,再用execlp调用新命令
- 注意调用新命令后,进程中的代码被替换,但文件描述符数组没有被替换
三 管道
- 使用fork()来共享管道
newfd1=dup2(pipe1[0],0);
理解:内核中默认存在三个管道(连接终端的输入,输出和错误流);每次创建一个进程都会将该进程中的文件描述符数组中的前三位与该三个管道(称为内核管道)连接(即搭建管道(称为连接管道));上述代码先删除了文件描述符0连接输入型内核管道的连接管道,再将文件描述符0与文件描述符pipe1[0]连接的内核管道连接;最后需要调用close(pipe1[0]),删除该文件描述符与内核管道的连接管道。- 读管道不注意就会发生读取阻塞现象:防止读匿名管道的无限阻塞问题的方法
按理说用read读取文件时,如果文件内容少于size,会返回实际读取的字节数,但是管道读取时就是一直阻塞
但按我的理解及实验,可推测:“读进程”在调用read对标准输入端进行读取时,若读取size不够,则会堵塞,这时需要关闭 读进程中 向标准输入端输入 的管道