标签:image 命令 dup lseek 技术 打开文件 png append printf
第三章习题
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! \n"); if (lseek(fd,5,SEEK_SET) < 0) /*将文件的偏移量设置为5*/ printf("lseek error! \n"); if (read(fd,buf1,5) < 0) /*从偏移量为5处读出五个字符*/ printf("read error! \n"); else printf("read:%s",buf1);/*将读出的字读输出*/ if (write(fd,buf2,10) < 0) /*将字符串buf2写入文件*/ printf("write error! \n"); }
标签:image 命令 dup lseek 技术 打开文件 png append printf
原文地址:https://www.cnblogs.com/Lis-/p/12824970.html