3.1 当读/写磁盘文件时,本章中形容的函数的确是不带缓冲机制的吗?请阐明起因:
本章中形容的read和write函数都是零碎调用,这两个函数都是在内核中进行的,所以是不带缓冲的I/O函数。而带有缓冲机制的函数是以内存空间作为缓冲区,防止不当操作升高多写性能。
3.2 编写一个与3.12节中dup2性能雷同的函数,要求不掉用fcntl函数,并且要有正确的出错解决:
3.3 假如一个过程执行上面3个函数调用:
fd1 = open(path, oflags);
fd2 = dup(fd1);
fd3 = open(path, oflags);
画出相似于图3-9的后果图。对fcntl作用于fd1来说,F_SETFD命令会影响哪一个文件描述符,F_SETFL呢?
(1)F_SETFD标记是文件描述符标记,只作用于一个过程的一个描述符,所以对于fctnl作用于fd1来说,只会影响fd1。
(2)F_SETFL标记是文件状态标记,作用于任何过程中的所有描述符,所以对于fctnl作用于fd1来说,会影响fd1,fd2。
3.4 许多程序都蕴含上面一段代码:
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
if (fd > 2)
close(fd);
为了阐明if语句的必要性,假如fd是1,画出每次调用dup2时3个描述符项及相应的文件表项的变动状况。而后再画出fd为3的状况。
因为 0、1、2别离对应stdin, stdout, stderr,是不应该敞开的,这段程序的目标是把stdin, stdout, stderr这三个规范fd重定向到同一个文件描述符里,当fd大于2时,因为目标曾经达成,大于2的fd曾经不须要了,为了防止造成节约,所以敞开它。
3.5 在Bourne shell、Bourne-again shell 和 Korn shell中,digit1 > &digit2示意将米哦啊难受digit1重定向至描述符digit2的同以文件。请阐明上面两条命令的区别
./a.out > outfile 2>&1
./a.out > 2>&1 outfile
(提醒:shell从左到右解决命令行)
(1)./a.out > outfile 2>&1
这条命令首先将规范输入重定向到outfile中,而后将规范谬误文件描述符重定向到规范输入指向的文件表项中,所以规范输入和规范谬误的文件描述符均指向outfile。
(2)./a.out > 2>&1 outfile
这条命令首先将规范谬误文件描述符重定向到规范输入指向的文件表项中,而后规范输入文件描述符又重定向到outfile文件中。所以最初规范输入的文件描述符和规范谬误的文件描述符不是指向同一个文件表项。
3.6 如果应用追加标记关上一个文件以便读、写,是否仍用lseek在任一地位开始读?是否用lseek更新文件中任一部分的数据?请编写一段程序验证