【UNIX/Linux】文件和目录【Part 4】

本文是笔者拜读《UNIX环境高级编程》第4章(文件和目录)的学习笔记。本文的主要内容包括chdir、设备特殊文件、第4章的小结和习题。文中不仅包含书中的知识点,也包括笔者的理解。
摘要由CSDN通过智能技术生成

本文是笔者拜读《UNIX环境高级编程》第4章(文件和目录)的学习笔记。本文的主要内容包括chdir、设备特殊文件、第4章的小结和习题。文中不仅包含书中的知识点,也包括笔者的理解。

函数chdir、fchdir和getcwd

每个进程都有一个当前工作目录,此目录是搜索所有相对路径名的起点。进程调用chdirfchdir更改当前工作目录。
在这里插入图片描述
在这两个函数中,分别用pathname或打开文件描述符指定新的当前工作目录。该函数只影响调用chdir的进程本身的当前工作目录,不影响其他进程。因此,shell的当前工作目录不会随着程序(shell的子进程)调用chdir而改变。cd命令是建在shell中的。
chdir跟随符号链接

函数getcwd提供了当前工作目录的完整绝对路径名。它从当前工作目录开始,先找到上一级目录,再读其目录项,找到目录项的i节点编号与当前工作目录的相同,这样就找到了文件名。逐层上移,直到遇到根目录。
在这里插入图片描述
getcwd有两个参数,一个是缓冲区地址buf,一个是缓冲区长度size(以字节为单位)。该缓冲区必须有足够的长度容纳路径名(包括'\0'),否则返回出错(NULL)。

设备特殊文件

st_devst_rdev

每个文件系统所在的存储设备都由其主、次设备号表示。设备号所用的数据类型是dev_t。主设备号标识设备驱动程序,次设备号标识特定的子设备。在同一磁盘驱动器上的各文件系统通常具有相同的主设备号,但次设备号不同

通常使用两个宏:majorminor来访问主、次设备号。

系统中与每个文件名关联的st_dev值是文件系统的设备号。文件系统包含了文件名以及与其对应的i节点。

只有字符特殊文件和块特殊文件才有st_rdev值。此值包含实际设备的设备号。

磁盘设备是块特殊文件,终端设备是字符特殊文件。

小结

本章围绕stat函数,详细介绍了stat结构中的成员。讨论了文件和目录在文件系统中是如何设计的以及如何使用文件系统命名空间。

习题

4.1

**题目:**用stat函数替换程序中的lstat函数,如若命令行参数之一是符号链接,会发生什么变化。
在这里插入图片描述
在这里插入图片描述
答:stat跟随符号链接,如果该程序使用stat获取文件信息,那文件/dev/cdrom的类型就不是符号链接,而是该文件所引用的文件的类型。

4.2

**题目:**如果文件模式创建屏蔽字是777,结果会怎么样?用shellumask命令验证该结果:

答: 第一个7表示对文件的所有者权限是可读、可写、可执行;第二个7表示对文件的所有者所在的组的其他用户而言,权限是可读、可写、可执行;第一个7表示对其他用户的权限是可读、可写、可执行。如果屏蔽了所有的这些权限,那任何用户对新创建的文件没有任何权限。

将umask设置为0777,并新建一个文本文件:
在这里插入图片描述
新建文件的访问权限:
在这里插入图片描述

4.3

题目: 关闭一个你拥有文件的用户读权限,将导致拒绝你访问自己的文件,对此进行验证。
答:
创建一个能正常访问的文本文件:
在这里插入图片描述
更改访问权限,关闭用户读权限:
在这里插入图片描述
在这里插入图片描述
无法访问该文件:
在这里插入图片描述

4.4

题目: 创建文件foobar后,运行图中的程序,会发生什么?
在这里插入图片描述
答: 因为文件foobar已存在,所以create函数错误返回。原文件不受任何影响,shell的文件模式创建屏蔽字也不会因为其子进程调用了umask函数而改变,

4.5

题目: 一个普通文件的大小可以为0,而st_size字段是为目录或符号链接定义的,那么目录和符号链接的长度能否为0
答: 不能。目录文件的长度不可能为0,一个目录至少包含当前目录和上一级目录两个目录项。符号链接文件的长度是其所引用文件名的字符串大小,所以也不可能为0

4.6

题目: 编写一个类似cp的程序,它复制包含空洞的文件,但不能将字节0输出到文件中去。
答: 每次从源文件读一大段数据放到缓冲区里,然后从头到尾分析缓冲区,将非'\0'的数据依次写入目标文件。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

#define N 1024

int TryWrite(int fd, char *buf, int len) {
   
	int wNum = write(fd, buf, len);
	if (wNum != len) {
   
		perror("write error");
		return -
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值