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 更新文件中任一部分的数据?请编写一段程序验证