xv6_《book-rev11》_第0章
fork() 与exec()
创建一个新进程的通常做法是调用fork()以后紧接着调用exec(),那么为什么不将这两个系统调用设计为一个呢?
fork()拷贝父进程的文件描述符表和内存内容,而exec()调用会替换掉父进程的内存内容,但是保留文件描述符表。这使得shell可以利用fork()实现IO的重定向,在子进程中重定位新的输入输出以后,再用子进程调用exec()执行新的程序处理文件。如果fork()和exec()被组合为一个系统调用,shell就需要另外的方法来重定向标准输入和输出,或者程序本身需要知道如何重定向输入输出。
文件描述符
- 文件描述符是一个小的整形数字,它是一个由内核管理的用于进程读写的对象。
- 文件描述符是一个相当有力的抽象,它屏蔽了它真正连接的事物的细节——一个进程可以通过文件描述符对文件、设备或是管道进行读写。
管道的优点
事实上很多情况下,管道可以被临时文件替代,比如:
echo hello word | wc
可以被替换为:
echo hello world >/tmp/xyz; wc </tmp/xyz
那么管道有哪些优点呢?在这种场景下,管道至少有以下优点:
- 管道会自动清理自己,而临时文件使用完毕后需要很谨慎地删除。
- 管道可以传送任意长度的流数据