APUE-第四章-习题笔记

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

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…”,其中…表示相应的日期和时间,程序时如何决定这些日期和时间的?

未解决 ^-.-^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值