《UNIX环境高级编程》 第三章 文件IO

第三章习题

1,当读/写磁盘时,本章中的确定时不带缓冲的IO吗?

答:是

带缓冲IO:用户缓冲区-内核缓冲区-磁盘

不带缓冲IO:内核缓冲区-磁盘

不带缓冲IO的话就每次都要系统调用后才能到内核缓冲区,时间开销大

2,编写一个和3.12一样dup2一样功能的程序,要求不调用fcntl,并且有正确的出错处理

 思路:复制文件描述符就dup dup2 fcntl三个函数  ,那么只能用dup了,他们申请的原则都是找到当前最小的那个没用的文件描述符,那么久一直申请,直到申请到那个描述符

3.假设一个进程执行下面三个函数调用

fd1=open(path,flags);

fd2=dup(fd1);

fd3=open(path,flags);

画出类似3-9的结果图,对于fd1作用于fcntl 来说,F_SETFD命令会影响哪一个文件描述符?F_SETFL呢?

 

2()盗图

F_SETFD :获得描述符

F_SETFL:获得描述符状态(读/写)

4.许多程序中都包含下面一段代码

dup2(fd,0)

dup2(fd,1)

dup2(fd,2)

if(fc>2) close(fd)

为了说明if语句的必要性,假设fd是1,画出每次调用dup2时三个描述符项及相应的文件表项的变化情况,然后再画出fd为3的情况

答:fd为1时,那么会变成0 1 2描述符,不会释放1,     fd为3的时候会有 0 1 2 3四个描述符,会释放3

5.在Bourne shell,Bourne-again shell和 Korn shell中,digit1>&digit2 表示要将描述符digit1重定向至描述符digit2的同一文件,请说明下面两条命令的区别

./a.out >outfile 2>&1

./a.out 2>&1>outfile

(提示:shell从左到右处理命令行)

答:第一个: 先将标准输出指向outfile   ,然后再将错误描述符指向标准输出,但是这个时候标准输出已经指向outfile,所有标准错误和标准输出都指向outfile

第二个:先将标准错误指向标准输出,然后再将标准输出指向outfile,结果就是标准错误指向标准输出,标准输出指向了outfile

6.如果使用追加标志打开一个文件以便读写能否lseek调整其他位置读写

答:因为追加就是在尾端写,那么用lseek调整后,read可以正常读取,但是write会自动到末尾然后开始写

#include "apue.h"
#include <fcntl.h>

int main(void)
{

        int fd;
        char buf1[20]; /*定义一个字符串用来读取文件中的字符*/
        char buf2[10]="onetwothre";/*用来写入的字符串*/
        if ((fd = open("/home/mocun/unix/chapter1/try",2|O_APPEND)) < 0)/*使用追加方式打开文件*/
                printf("open error! 
");
        if (lseek(fd,5,SEEK_SET) < 0) /*将文件的偏移量设置为5*/
                printf("lseek error! 
");
        if (read(fd,buf1,5) < 0)     /*从偏移量为5处读出五个字符*/
                printf("read error! 
");
        else
                printf("read:%s",buf1);/*将读出的字读输出*/
        if (write(fd,buf2,10) < 0)    /*将字符串buf2写入文件*/
                printf("write error! 
");
}
原文地址:https://www.cnblogs.com/Lis-/p/12824970.html