APUE-第四章-习题笔记

本文主要探讨了APUE第四章的习题,涉及stat与lstat的区别、文件模式创建屏蔽字的影响、权限验证、文件复制、目录和符号链接的特性、磁盘空间检查、unlink函数行为、打开文件数限制、chroot函数的应用场景等内容,深入解析了文件系统和权限管理的相关知识。

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

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

stat函数返回与此命名文件有关的信息结构。而lstat函数类似于stat,但是当命名文件是一个符号链接时,lstat返回该符号链接的有关信息,而非由该符号链接引用文件的信息。

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

这里写图片描述
可以看到,创建屏蔽字,则将屏蔽所有操作。

4.3 关闭一个你所拥有的文件的用户读权限,将导致不允许你访问自己的文件,对此进行验证。

这里写图片描述

4.4 创建文件foo和bar后,运行程序清单4-3中的程序,这将会发生什么?

这里写图片描述
通过运行程序发现,foo的权限位没有发生变化。

4.5 4.12 节中,讲到一个普通文件的大小可以为0,同时我们又知道st_size字段为目录或符号链接定义的。

那么目录和符号链接的长度是否可以为0?
不可以为0,对于目录和符号链接,文件长度是一个数(16或512)的倍数。
如图:
这里写图片描述
其中dir是一个空的目录,可以看出其文件长度为4096。

4.6 编写一个类似cp(1)的程序,它复制包含空空洞的文件,但不将字节0写到输出文件中。

#include "apue.h"
#include "stdio.h"
#include "fcntl.h"

int main(int argc,char *argv[]){
    int fd;
    int target;
    if(argc != 2)
            err_sys("parameter error");


    if((fd = open(argv[1],O_RDONLY)) == -1){
        err_sys("open the copy file error");
        exit(0);
    }

    if((target = creat("target",FILE_MODE)) < 0)
        err_sys("creat target file error");

    //reaf while end
    char tmp;
    while(read(fd,&tmp,1) == 1){
        if(tmp != 0 ){
            write(target,&tmp,1);
        }
    }

    exit(0);
}

实验结果如图:
这里写图片描述

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

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

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

  • df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
  • du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看

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

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

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

因为myftw中调用了dopath()而在dopath中调用了open_dir()。如果有打开文件数的限制,则可能会导致open_dir的调用失败。

4.11 4.21节中的myftw从不改变其目录,对这种处理方式进行改动:每一次遇到一个目录就用其调用chdiri,这样每次调用lstat时就可以使用文件名而非路径名,处理完所有的目录项之后,执行chdir(”..”),比较这两种版本程序的运行时间。

这里写图片描述
第一个是原始的代码,第二个是修改过的,可以看出修改之后,时间变长。

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

  • 测试和开发
    可以经由chroot创建一个测试环境,用来测试软件。这可以减少将软件直接布署到整个生产系统中可能造成的风险。
  • 依赖控制
    可以在chroot创建的环境下,进行软件开发,组建以及测试,只保留这个程序需要的软件依赖。这可以避免在系统中预先安装的各种软件库,影响到开发,造成软件开发者在组建软件时,可能遇到一些链接冲突。
  • 兼容性
    早期遗留软件或使用不同应用二进制接口(ABI)的软件,因为它们提供的软件库和宿主机的库之间,可能发生名称或链接冲突,可以在chroot环境下运行,以保持系统安全。
  • 修复
    当一个系统不能启动时,可以使用chroot,先从另一个根文件系统(比如从安装媒体,或是Live CD)下开机,之后再回到受损的环境中,重新修正系统。
  • 特权分离
    将允许打开文件描述子(例如文件,管线或是网络连接)的程序放到chroot下运行,不用特地将工作所需的文件,放到chroot路径底下,这可以简化软件监狱的设计。chroot简化了安全设计,可以创造出一个沙盒环境,来运行一个有潜在危险的特权程序,以先期防御可能的安全漏洞。但值得注意的是,chroot没有足够能力去防御一个拥有root特权的进程造成危害。

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

首先获取不需要修改的时间,然后在utime将其保持原值。

4.14 有些版本的finger(1)命令输出“new mail received …”和“unread since…”,其中…表示相应的日期和时间,程序时如何决定这些日期和时间的?

未解决 ^-.-^

### 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、付费专栏及课程。

余额充值