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