Apue第四章习题答案

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

改之前:

root@clstore3 ~ #。//etc/passwd lstat/etc/dev/log/dev/tty/dev/sr0/dev/cdrom

/etc/passwd:定期

/etc:目录

/dev/日志:套接字

/dev/tty:性格特别

/dev/sr0:块特殊

可以看的出,lstat把/dev/cdrom当着软链接去看。

现在我们把程序lstat改为统计之后,允许结果如下,可以看统计查看的是符号链接所引用的文件的信息,

结论:lstat函数类似于统计,但当命名的文件是一个符号链接时,lstat返回该符号链接的有关信息,而不是有该符号链接引用的文件的信息只

root@clstore3 ~ #。/统计/etc/passwd/etc/dev/log/dev/tty/dev/sr0/dev/cdrom

/etc/passwd:定期

/etc:目录

/dev/日志:套接字

/dev/tty:性格特别

/dev/sr0:块特殊


#包括“apue。int h”

主要(int命令行参数个数,char * argv [])

{

,int我;

,struct stat buf;

,char * ptr;


(i=1;我& lt;命令行参数个数;我+ +){

,printf (" % s:“argv[我]);

,如果(stat (argv[我],和buf) & lt;0){,/*这需要改变lstat此药*/,

,,err_ret (“lstat错误”);

,,继续;

}

,如果(S_ISREG (buf.st_mode))

,,,ptr="常规";

, else if (S_ISDIR (buf.st_mode))

,,,ptr=澳柯肌?

, else if (S_ISCHR (buf.st_mode))

,,,ptr="字符特殊”;

, else if (S_ISBLK (buf.st_mode))

,,,ptr="块特殊”;

, else if (S_ISFIFO (buf.st_mode))

,,,ptr=癴ifo特别”;

, else if (S_ISLNK (buf.st_mode))

,,,ptr="符号链接",

, else if (S_ISSOCK (buf.st_mode))

,,,ptr="套接字",

,

其他,,,ptr=? *模式不明* *”,

, printf (" % s \ n ", ptr);

}

,退出(0);}


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

[root@clstore3 ~] 0022 # umask

改为777后

[root@clstore3 ~] # umask 777

[root@clstore3 ~] 0777 # umask

创建一个test3文件子后,只有根可以看,也不可以更改了只

root@clstore3 ~ # vim test3。txt

[root@clstore3 ~] # ls过程test3.txt

- - - - - - - - - - -。1根根12 11月13 test3 10点。txt


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

[root@clstore3 ~] # chmod 640/home/zhangb/Makefile

[root@clstore3 ~] # ls过程/home/zhangb/Makefile

-rw-r - - - - - -。1根根18709年5月22日17:32/home/zhangb/Makefile

切换到用户zhangb,由于用户zhangb没有该文件的读权限,所以不能查看该文件只

[root@clstore3 ~] # su - zhangb

522868美元ls过程Makefile

-rw-r - - - - - -。1根根18709年5月22日17:32 Makefile

少522868美元Makefile

Makefile:拒绝访问

522868 522868 whoami


<强> 强,创建文件foo和bar后,运行图4 - 9日的程序,将发生什么情况?

什么都没有发生,权限为没有任何改变只

[root@clstore3 ~] #触摸foo酒吧

[root@clstore3 ~] # ls过程foo酒吧

-rw-r——r。1根根0 11月13日34条

-rw-r——r。1根根0 11月13日34 foo

root@clstore3 ~ #。/create_foobar

[root@clstore3 ~] # ls过程foo酒吧

-rw-r——r。1根根0 11月13日34条

-rw-r——r。1根根0 11月13日34 foo


# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

root@clstore3 ~ #猫create_foobar。c

#包括“apue。h”

# include & lt; fcntl.h>

# define RWRWRW (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) int

主要(void)

{

, umask (0);

如果创造(" foo ", RWRWRW) & lt;0)

,,err_sys (“foo创建错误”);

, umask (S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);

如果创造(“酒吧”,RWRWRW) & lt;0)

,,err_sys(“创建错误栏”);

,退出(0);

}


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

:对于普通文件,其文件长度可以是0,在开始读写这种文件是,将得到文件(文件尾)指示。

对于目录,文件长度通常是一个(16 or512)的整倍数只

符号链接——文件长度是在文件名中的实际字节数。

[root@clstore3/] # ls过程/dev/cdrom

Apue第四章习题答案