4.1 用 stat 函数替换图 4-3 程序中的 lstat函数,如若命令行残数之一是符号链接,会发生什么变化?
stat不支持链接,如果有参数是链接符号,会显示链接后的文件属性。
4.2 如果文件模式创建屏蔽字 777 (八进制),结果会怎样?用shell的umask命令验证该结果
pi@raspberrypi:~/chen_DIR/APUE/chapter_4 $ vim ex4-2.c pi@raspberrypi:~/chen_DIR/APUE/chapter_4 $ gcc ex4-2.c pi@raspberrypi:~/chen_DIR/APUE/chapter_4 $ ./a.out pi@raspberrypi:~/chen_DIR/APUE/chapter_4 $ ls 4-12.c 4-21.c 4-23.c 4-25.c 4-8.c a.out ex4-2_bar ex4-2_foo myfile times 4-16.c 4-22.c 4-24.c 4-3.c 4-9.c changemod ex4-2.c foo tags pi@raspberrypi:~/chen_DIR/APUE/chapter_4 $ ls -la ex4-2_bar ex4-2_foo ---------- 1 pi pi 0 Dec 1 08:52 ex4-2_bar -rw-rw-rw- 1 pi pi 0 Dec 1 08:52 ex4-2_foo
会把所有的位都屏蔽掉
4.3 关闭一个你所拥有文件的用户读权限,将导致拒绝你访问自己的文件,对此进行验证。
pi@raspberrypi:~/chen_DIR/APUE/chapter_4 $ chmod u-rw ex4-2_foo pi@raspberrypi:~/chen_DIR/APUE/chapter_4 $ cat ex4-2_foo cat: ex4-2_foo: Permission denied
4.4 创建文件foo和bar后,运行图4-9的程序,讲发生什么情况?
pi@raspberrypi:~/chen_DIR/APUE/chapter_4 $ ./a.out pi@raspberrypi:~/chen_DIR/APUE/chapter_4 $ ls -l foo bar -rw------- 1 pi pi 0 Dec 1 09:25 bar -rw-rw-rw- 1 pi pi 0 Dec 1 09:25 foo pi@raspberrypi:~/chen_DIR/APUE/chapter_4 $ chmod a-r foo bar pi@raspberrypi:~/chen_DIR/APUE/chapter_4 $ ls -l foo bar --w------- 1 pi pi 0 Dec 1 09:25 bar --w--w--w- 1 pi pi 0 Dec 1 09:25 foo pi@raspberrypi:~/chen_DIR/APUE/chapter_4 $ ./a.out pi@raspberrypi:~/chen_DIR/APUE/chapter_4 $ ls -l foo bar --w------- 1 pi pi 0 Dec 1 09:26 bar --w--w--w- 1 pi pi 0 Dec 1 09:26 foo
文件的权限没有变,但是文件内容什么的修改时间都被改了。
4.5 4.12节中讲到一个普通文件的大小可以为0,同时我们又知道st_size字段是为目录或符号链接定义的,那么目录和符号链接的长度是否可以为0?
目录的长度从来不会是0,因为它总是包含 . 和 .. 两项。符号链接的长度指其路径名包含的字符数,由于路径名中至少有一个字符,所以长度也不为0。
4.6 编写一个类似cp(1)的程序,他复制包含空洞的文件,但不将字节0写到输出文件中去。
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #define BUF_SIZE 4096 int main(int argc, char *argv[]) { char *filePathFrom; char *filePathTo; int fdFrom, fdTo; int have_holes, byte_count, res, current_position; char buff[BUF_SIZE]; struct stat st; if(argc !=3 || !argv[1] || !argv[2]) { fprintf(stderr, "Usage: %s <source file path> <target file path> ", argv[0]); exit(1); } filePathFrom = argv[1]; filePathTo = argv[2]; if((fdFrom = open(filePathFrom, O_RDWR)) < 0) { fprintf(stderr, "open path from error"); exit(1); } if(fstat(fdFrom, &st) != 0) fprintf(stderr, "stat error"); else { if(S_ISREG(st.st_mode) && st.st_size > 512 * st.st_blocks) { have_holes = 1; printf("%s is a sparse-block file! ", filePathFrom); } else { have_holes = 0; printf("%s is not a sparse-block file! ", filePathFrom); } } if((fdTo = open(filePathTo, O_RDWR|O_APPEND|O_CREAT|O_TRUNC, 0666)) < 0) { fprintf(stderr, "open path to error"); exit(1); } memset(buff, '