45习题答案.docx

上传人:小飞机 文档编号:3148252 上传时间:2023-03-11 格式:DOCX 页数:15 大小:41.91KB
返回 下载 相关 举报
45习题答案.docx_第1页
第1页 / 共15页
45习题答案.docx_第2页
第2页 / 共15页
45习题答案.docx_第3页
第3页 / 共15页
45习题答案.docx_第4页
第4页 / 共15页
45习题答案.docx_第5页
第5页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《45习题答案.docx》由会员分享,可在线阅读,更多相关《45习题答案.docx(15页珍藏版)》请在三一办公上搜索。

1、45习题答案一、选择 1. 文件系统保存在磁盘的 A 引导块 B 超级块 C i节点块 D 数据块 2. linux文件系统的根目录的i节点号为 A 0 B 1 C 2 D 3 3. 文件描述符的数据类型为 A char B int C double D float 4. 设置文件偏移量的系统调用是 A truncate B sync C lseek D creat 5. 下面哪个不是lseek第三个参数的取值 A SEEK_SET B SEEK_CUR C SEEK_NOW D SEEK_END 6. sync系统调用的功能是 A 刷新所有缓存到磁盘 B 刷新缓存中某个文件的所有信息到磁盘

2、C 刷新缓存中某个文件的数据到磁盘 D 刷新缓存中某个文件的属性信息到磁盘 7. fsync系统调用的功能是 A 刷新所有缓存到磁盘 B 刷新缓存中某个文件的所有信息到磁盘 C 刷新缓存中某个文件的数据到磁盘 D刷新缓存中某个文件的属性信息到磁盘 8. fdatasync系统调用的功能是 A 刷新所有缓存到磁盘 B 刷新缓存中某个文件的所有信息到磁盘 C 刷新缓存中某个文件的数据到磁盘 D刷新缓存中某个文件的属性信息到磁盘 9. 可以使用系统调用获得符号链接所引用文件名称。 A link B symlink C readlink D softlink 10. 获得工作路径名称的系统调用是 A

3、getcwd B getpwuid C getgrgid D getlogin 11. 通过文件属性中的uid获得文件拥有者名字的系统调用是 A getcwd B getpwuid C getgrgid D getlogin 12. 通过文件属性中的gid获得文件所属组名的系统调用是 A getcwd B getpwuid C getgrgid D getlogin 13. 根据文件路径来改变文件权限使用系统调用 A chown B chmod C fchmod D fchown 二、填空 1. 磁盘被看作是由_块_构成的,它的大小是扇区的倍数,扇区的大小一般是_512字节_。 2. 每块物理

4、磁盘可以被分成片,每片可以被称作_卷_或_分区_。每片对应一个特殊文件,特殊文件名由设备名构成,如“hd*n”或“sd*n”,其后跟随数字和字母,如/dev/hda5代表的设备为_第一块物理磁盘的第5个分区_。 3. statvfs系统调用可以获得_文件系统_信息,该信息保存在磁盘的_超级块_中。 4. 文件系统的安装是指_将一个文件系统连接到一个已经存在的文件系统上_,可使用系统调用_mount_实现;卸载是指_将两个文件系统的连接断开_,可使用系统调用_umount_实现。 5. Linux系统下,表示标准输入、标准输出和标准错误输出的文件描述符为_STDIN_FILENO_、_ STDO

5、UT_FILENO _和_ STDERR_FILENO _,它们的值分别为_0_、_1_、_2_。 6. 文件描述符是对_进程打开文件表_的索引,进程表中的每个记录项指向一个_打开文件描述_,打开文件描述最终会找到_复制到内存中的文件的i节点_。 7. 数字635表示的权限使用字母方式表示为_rwwxr-x_,使用符号方式表示为_S_IRUSR|S_IWUSR|S_IWGRP|S_IXGRP|S_IROTH|S_IXOTH_。 8. 系统调用open的功能是_打开或创建文件_。 9. 使用open打开文件时有三个标志必须要选择其一,这三个标志是_O_RDONLY_、_O_WRONLY_、_O_

6、RDWR_。 10. O_EXCL与O_CREAT合用表示_文件不存在则创建,否则失败_。 11. 文件偏移量代表_下一次读或写的位置_。 12. 将文件偏移量设置为当前偏移处之前的4个字节的位置,使用lseek(fd,_4_,_SEEK_CUR_)。 13. 设置打开文件标志_O_TRUNC_可以截短文件为0,使用系统调用_truncate_可以截短或加长文件。 14. 如果umask设为022,则创建一个新文件的权限为_644_,创建一个新目录的权限为_755_。 15. 如果umask设为024,则创建一个新文件的权限为_642_,创建一个新目录的权限为_753_。 16. 使用系统调用

7、_umask_可以设置和得到文件模式的屏蔽字。 17. 系统调用_unlink_的作用是删除目录项,这里的目录项是指_文件名和文件i节点的对应关系_。 18. 创建硬链接使用系统调用_link_,创建符号链接使用系统调用_symlink_。 19. 获得工作路径名称的系统调用是_getcwd_。 20. 可以使用_stat或fstat或lstat_系统调用显示文件属性信息。 21. chmod、chown、utime都可以修改文件i节点的信息,其中chmode的功能是_更改文件权限_,chown的功能是_更改文件所有者和所属组_,utime的功能是_更改文件访问时间和修改时间_。 22. 打开

8、目录使用_opendir_系统调用,关闭目录使用_closedir_系统调用,读取目录内容使用_readdir_系统调用。 23. chdir系统调用的功能是_改变当前目录_。 24. 创建目录使用_mkdir_系统调用,删除目录使用_rmdir_系统调用。 25. 若实现将标准输出重定向到文件描述符为6对应的文件上,则应使用语句_dup2(6,1)_。 三、判断并解释原因 1. 一个文件的硬链接中,第一个创建的硬链接与其他硬链接相比总是最后一个被删除 硬链接之间平等 2. 可以对普通文件和目录文件创建硬链接和符号链接。 对目录不可以创建硬链接 3. 给一个文件创建硬链接时,如果新的链接文件已

9、经存在,则覆盖之。 返回错误 4. 一个符号链接不能再引用另一个符号链接。 可以 5. lstat系统调用可以获得某符号链接所引用的文件的i节点信息。 返回符号链接文件本身的i节点信息 6. 父进程打开文件返回文件描述符后创建的子进程共享父进程的文件描述符 7. 对于一个已经打开的文件来说,读和写的位置使用不同的偏移量 文件偏移量代表下一次读或写的位置 8. 多个进程打开同一个文件,这几个进程共用读写偏移量 每个进程的每次open都会得到一个打开文件描述,文件描述中保存文件偏移量,不同进程的open得到的是不同的打开文件描述,因此不同 9. 父进程打开一个文件后创建的子进程与父进程共用读写偏移

10、量 四、简答 1. 简述文件、i节点、文件名、目录之间的关系。 答:每个存在磁盘上的文件都由i节点和数据块两部分组成,i节点和文件一一对应,一个i节点可以对应多个文件名,文件名和i节点的对应关系叫做文件的硬链接,文件名和i节点的对应关系保存在目录文件中。 2. 回答stat、fstat、lstat三个系统调用的区别。 答:stat根据路径获得文件元数据信息 fstat根据文件描述符获得文件元数据信息 前两者如果遇到符号链接文件则会一直引用至非符号链接文件 lstat获得符号链接文件本身的文件元数据信息 3. 使用什么方式来判断一个文件是什么类型的?使用什么方式来判断文件的权限? 答:首先使用s

11、tat获得文件属性结构体为struct stat,其中的成员变量st_mode代表了文件类型及权限。st_mode共16位,1215位代表文件类型,可根据这四位进行判断文件类型。08位代表三类用户的九种权限,可根据这9位进行判断文件的权限。 4. dup和dup2的区别和联系? 答: 联系:dup与dup2都用来将新文件描述符指向原来文件描述符指向的打开文件描述。 区别:dup返回的新文件描述符为最小可用的文件描述符,dup2返回的新文件描述符可以通过第二个参数指定。 5. 什么是文件描述符? 答: 一个非负整数,内核以此来标识一个特定进程正在操作的文件。 012代表三个标准的文件描述符,分别

12、为标准输入、标准输出、标准错误输出 6. 使用符号方式表示rwxrwxrwx权限。 答: S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH| S_IWOTH|S_IXOTH 7. 写出open的以下6种打开标志:只读、只写、读写、追加、文件不存在创建、截短为0。 O_RDONLY O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC 8. 硬链接和符号链接的区别. 命令 ln 原文件 硬链接文件 ln s 原文件/目录 符号链接文件 是否新增文件:硬链接不增文件,符号链接增加文件。 删除原文件/目录 硬链

13、接:对应i节点链接数-1。 符号链接:符号链接文件失效。 删除链接文件 删除硬链接文件,使对应i节点的链接数-1。 删除符号链接文件,对原文件/目录无任何影响 是否跨文件系统:硬链接不可以,符号链接可以 五、读程序写结果 1. 读程序,写出执行结果,并解释得到该结果的原因。 main int fd1,fd2; fd 1= open(“/etc/passwd”, O_RDONLY); fd 2= open(“/etc/passwd”, O_RDWR); printf(“fd1 = %d fd2=%dn”, fd1,fd2); close(fd2); 结果:fd1=3 fd2=4 原因:open返

14、回的文件描述符为最小可用的非负整数,012是三个标准的文件描述符默认已经被占用,所以第一个open的返回值为3,第二个open返回的是4。 2. 读程序,写出执行结果,并解释得到该结果的原因。 #include #include main int fd; fd=open(/etc/passwd,O_RDONLY); if(fork!=0) wait; printf(fd in parent %dn,fd); else printf(fd in child %d n,fd); 结果:fd in child 3 fd in parent 3 close(fd); 原因: 父进程打开文件返回的文件描

15、述符为3,子进程拷贝父进程空间,所以fd值也为3。 由于父进程要执行的if分支中有wait函数,所以等子进程结束后父进程才继续执行。 3. 读程序,写出执行结果,并解释得到该结果的原因。 #include #include main int fd,pos; fd=open(f1,O_RDWR|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR); char f10; char z10=123456789; if(fork!=0) wait(NULL); printf(fd in p %dn,fd); read(fd,f,5); write(1,f,5); printf(n); el

16、se printf(fd in c %d n,fd); write(fd,z,sizeof(z)-1); pos=lseek(fd,0,SEEK_SET); printf(“pos=%dn”,pos); 结果:fd in c 3 pos=0 fd in p 3 12345 原因:子进程拷贝父进程空间,所以子进程中fd也为3。 子进程与父进程共用文件偏移量,所以子进程写完10个字符后,又调用lseek系统调用使得偏移量又为0,所以父进程从0偏移量处读取前5个字符。 1为标准输出,所以write会将f中的前5个字符打印在屏幕上,而f中恰是刚刚从0偏移量处读出的5个字符。 五、编程 1. 向文件f1

17、中写入“hello world!”,然后再将f1中的内容读出并显示在屏幕上。 #include #include #include int main int fd; char buf113=hello world!; char buf212; int num; fd = open( f1,O_RDWR| O_CREAT | O_TRUNC, 0644); if(fd=-1) perror(f1 not open); exit(1); num=write(fd,buf1,sizeof(buf1)-1); if(num!=(sizeof(buf1)-1) printf(write less tha

18、n wantn); lseek(fd,0,SEEK_SET); num=read(fd,buf2,12); if(num!=12) printf(read less than 12n); write(1,buf2,12); close(fd); 2. 向文件f2中写入“aabbccddee”,然后将偏移量移到绝对偏移为4的位置处,读6个字符,并将结果显示在屏幕上。 #include #include #include int main int fd; char buf111=aabbccddee; char buf210; int num; fd = open( f2,O_RDWR| O_CR

19、EAT | O_TRUNC, 0644); if(fd=-1) perror(f2 not open); exit(1); num=write(fd,buf1,sizeof(buf1)-1); if(num!=(sizeof(buf1)-1) printf(write less than wantn); lseek(fd,4,SEEK_SET); num=read(fd,buf2,6); if(num!=6) printf(read less than 6n); write(1,buf2,6); close(fd); 3. 向文件f3中写入“aabbccddeeffgghh”,然后将文件截短至

20、8个字节,然后将截短后的文件内容读出并显示在屏幕上。 #include #include #include int main int fd; char buf117=aabbccddeeffgghh; char buf28; int num; fd = open( f3,O_RDWR| O_CREAT | O_TRUNC, 0644); if(fd=-1) perror(f3 not open); exit(1); num=write(fd,buf1,sizeof(buf1)-1); if(num!=(sizeof(buf1)-1) printf(write less than wantn);

21、 lseek(fd,0,SEEK_SET); ftruncate(fd,8); num=read(fd,buf2,8); if(num!=8) printf(read less than 8n); write(1,buf2,8); close(fd); 4. 在程序中将umask改至044,创建文件f4。 #include #include #include int main int fd; umask(044); creat(f4,S_IRUSR|S_IWUSR); 5. 实现“cat 文件名”显示文件内容。 #include main(int argc,char *argv) int fd

22、; int num; char buf10; if(argc!=2) printf(miss filenamen); exit(1); fd=open(argv1,O_RDONLY); if(fd=-1) perror(error open); exit(1); while(num=read(fd,buf,10)!=0) write(1,buf,num); close(fd); 6. 实现“cp 原文件 目标文件” #include #include main(int argc,char *argv) int from,to; int num; char buf10; if(argc!=3)

23、printf(argument errorn); exit(1); from=open(argv1,O_RDONLY); if(from=-1) perror(error open from); exit(1); to=open(argv2,O_WRONLY|O_CREAT|O_TRUNC,0644); if(to=-1) perror(error open to); exit(1); num=read(from,buf,10); while(num!=0) write(to,buf,num); num=read(from,buf,10); close(from); close(to); 7.

24、 编程实现:命令行参数有2个,如果参数为a,则显示“aaaaa”,如果参数为b的话,则显示“bbbbb”,否则显示“other”。 main(int argc,char *argv) if(argc=2) if(strcmp(argv1,a)=0) printf(aaaaaaaaaaaaaaan); else if(strcmp(argv1,b)=0) printf(bbbbbbbbbbbbbbbn); else printf(othern); 8. 编写程序pro3.c,将字符串“hello world”通过输出重定向方式写入文件f1中。 #include #include #include

25、 #include #include main int fd; if(fd=open(f1,O_WRONLY|O_CREAT,0644)=-1) perror(open fail); if(dup2(fd,1)=-1) perror(Redirect failed); printf(Hello worldn); close(fd); 以下答案略 9. 实现“ll 文件名”功能 10. 实现“ls l 文件名”功能。 11. 实现“ls”功能 12. 实现“ls i”功能 13. 实现“ls 目录”功能 14. 实现“ls l”功能 15. 实现“cd 目录”功能 16. 实现“cd”功能 17. 实现“cp 文件 目录”的功能。 18. 实现“cp 目录 目录”功能,不必处理符号链接、硬链接,不用保持所有权、权限位、时间。 19. 实现“cp 目录 目录”功能,保持所有权、权限位、时间。 20. 实现“cp 目录 目录”功能,保持符号链接、硬链接。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号