[APUE] 第四章习题解答

本文详细介绍了Linux中文件操作的关键函数,如stat、lstat,并解释了它们在符号链接处理上的区别;同时探讨了文件模式创建屏蔽字的作用及umask命令的使用;深入分析了普通文件、目录及符号链接的长度能否为0;比较了ls命令输出差异的原因;解释了df与du命令的区别,以及unlink函数如何影响文件状态改变时间;讨论了myftw函数在系统对可打开文件数限制下的表现;阐述了chroot函数在改变根目录时的安全性和实用性;最后,说明了如何使用utime函数仅设置文件的访问时间或修改时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4.1 用stat函数替换程序4-1中的lstat函数,如若命令行参数之一是符号链接,会发生什么变化。

lstat不会跟随符号链接,因此,它所得到的属性就是链接文件本身的属性。如果换成了stat,就是符号链接所引用的文件的属性了。


4.2 如果文件模式创建屏蔽字是777,结果会怎么样?用shell的umask命令验证该结果。

如果文件模式创建屏蔽字是777,那么创建的文件或者目录没有任何权限,甚至,对于目录来说,创建了目录之后,不能使用ls命令查看目录里面的内容。


4.5 4.12节中讲到一个普通文件的大小可以为0,同时我们又知道st_size字段是为目录或者符号链接定义的,那么目录和符号链接的长度是否可以为0?



4.7 在4.12节ls命令的输出中,core和core.copy的访问权限不相同,如果创建两个文件时umask没有变,说明为什么会产生这种差别。

core是之前创建的,而core.copy是是采用cat命令拷贝的,是新创建的文件,它采用的是默认的创建屏蔽字,两个不同,说明新创建的这个文件并没有继承原来文件的访问权限位。


4.8 在运行程序清单4-5中的程序时,使用了df命令来检查空闲的磁盘空间。为什么不使用du命令?

du命令是通过将指定文件系统中所有的目录、符号链接和文件使用的块数累加得到该文件系统使用的总块数。

df命令是通过查看文件系统中磁盘块分配图得出总块数和剩余块数。

因此,du得到的结果并没有考虑如索引节点、目录项等使用的空间,而df是从总体上考虑了所有使用的空间,df比du更加精确。


4.9 表4-11中显示unlink函数会修改文件状态改变时间,这是怎样发生的?

因为unlink会修改索引节点的引用计数,所以它会修改文件状态改变时间。


4.10 4.21节中,系统对可打开文件数的限制对myftw函数会产生什么影响?

在myftw中调用了dopath,在dopath中调用了opendir:opendir打开一个目录,但是opendir底层使用文件描述符来访问目录本身,因此,如果系统对可打开文件数有限制,那么,opendir可能会因为文件描述符不够而调用失败。


4.12 每个进程都有一个根目录用于解析绝对路径名,可以通过chroot函数改变根目录。在手册中查阅此函数,说明这个函数什么时候有用。

chroot可以改变进程所在的根目录,在解析路径时,从根目录开始解析。使用chroot可以限制用户所访问的范围,增强系统的安全性,建立一个与原目录隔离的目录结构,方便用户的开发。


4.13 如何使用utime函数只设置两个时间值中的一个?

用stat获取三个时间,然后在使用utime时,不想改变的就设置为stat获取的时间。

### APUE 第三章 学习笔记 #### 文件 I/O 基础 APUE 的第三章主要讨论了 Unix 系统中的文件 I/O 操作基础。这一章节涵盖了多个重要的概念技术细节,对于理解如何高效地操作文件至关重要。 #### 打开关闭文件 为了打开一个文件,程序通常会使用 `open` 或者 `creat` 函数[^1]。这两个函数都返回一个小于零的整数作为错误指示,而成功的调用则返回一个非负整数表示新创建文件描述符。当不再需要访问某个特定文件,应该通过调用 `close` 来关闭它。这不仅释放了与该文件关联的操作系统资源,而且也使得这个文件描述符能够被重新利用。 ```c #include <fcntl.h> /* For O_* constants */ #include <unistd.h> /* For open(), close() */ int fd; fd = open("example.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); if (fd >= 0) { // File opened successfully. } // Later... close(fd); ``` #### 文件读写 一旦有了有效的文件描述符,就可以对其进行读取 (`read`) 写入 (`write`) 操作。这些基本的 I/O 操作允许应用程序直接处理底层的数据流而不必关心具体的设备特性[^2]。 ```c char buffer[BUFSIZ]; ssize_t n; n = read(fd, buffer, BUFSIZ - 1); if (n > 0) { buffer[n] = '\0'; // Null terminate the string printf("%s\n", buffer); } const char *msg = "Hello world!"; write(fd, msg, strlen(msg)); ``` #### 文件定位 除了简单的顺序读写外,还可以改变当前文件偏移量来实现随机访问。这是通过 `lseek` 实现的功能之一,它可以向前或向后移动文件指针的位置以便从不同的位置开始读写数据[^3]。 ```c off_t offset; offset = lseek(fd, SEEK_SET, 0); // Move to beginning of file if (offset != -1L) { // Seek succeeded. } ``` #### 特殊文件类型的支持 Unix 系统支持多种特殊类型的文件对象,比如管道、套接字以及终端设备等。本章还介绍了针对这些不同类型文件的具体 API 接口支持机制[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值