课后题解答参考

  • 格式:doc
  • 大小:40.50 KB
  • 文档页数:4

5.《Unix环境高级编程》第3章习题3.3、3.4 (p69)

目的:理解文件描述符及dup函数作用

解答:

3.3 参考答案

int dup(int fd); 功能:返回新的文件描述符与参数fd共享同一个文件表项,且此时返回的新文件描述符一定是当前可用文件描述符中的最小值。

Open()功能:打开文件,若成功则返回文件描述符。每次调用open函数就分配一个文件表项,如果两次打开的是相同的文件,则两个文件表项指向相同的v节点。

int fcntl(int fd, int cmd,…);该函数若执行成功则依赖于cmd,在本题中涉及:

cmd=SETFD,表示fd设置文件描述符标记,新标志值按第三个参数设置。(注意:每个文件描述符都有它自己的一套文件描述符标志。)

cmd=SETFL,表示fd的文件设置文件状态标志,即作用于所打开的文件表。

3.4 参考答案

int dup(int fd1, int fd2); 功能:用fd2参数指定新的文件描述符值,且此文件描述符与参数fd1共享同一文件表项。如果fd2已经打开,则先将其关闭,如若fd1=fd2,则dup2返回fd2,而不关闭它。

dup2(int oldfd,int newfd)是在当newfd已经指向一个文件时,关闭newfd(跟重定向效果一样),所谓的关闭只是将文件的引用计数减去1,当引用计数是0时,就将文件关闭,非0时都只是将引用计数减去1,文件并不关闭。

测试程序:

#include

#include

#include

#define BUF 4096

#define RWXRWXRWX (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH)

int main()

{

int n;

int fd0;

int fd1;

int fd2;

int fd3;

char buf[BUF];

fd0=open("demo111",O_RDWR|O_CREAT,RWXRWXRWX);

printf("before fd0=%d\n",fd0);

dup2(fd0,fd1);

dup2(fd0,fd2);

dup2(fd0,fd3);

printf("fd0=%d\n",fd0);

printf("fd1=%d\n",fd1);

printf("fd2=%d\n",fd2);

}

另外注意:close(fd)的功能是:关闭fd指向的文件,终止fd与其对应文件之间的联系,文件描述符被释放并能够重新使用。

执行到if 语句时,fd这个文件描述符会被系统回收,以备其他应用时再分配。

6.《Unix环境高级编程》第4章习题4.2、4.3、4.4、4.5 (p107)

目的:理解文件访问权限及文件模式屏蔽字的作用

解答:

4.2 参考答案

验证过程:

[root@localhost 2014user]# umask 777

[root@localhost 2014user]# date >temp.foo

[root@localhost 2014user]# ls -l temp.foo

---------- 1 root root 29 3月 7 09:34 temp.foo

解释:

umask是从权限中“拿走”相应的位,且文件创建时不能赋予执行权限。

umask设置了用户创建文件的默认权限,它与chmod的效果刚好相反,umask设置的是权限“补码”,而chmod设置的是文件权限码。

当我们登录系统之后创建一个文件总是有一个默认权限的,以确保你创建的文件具有所希望的缺省权限,防止其他非同组用户对你的文件具有写权限。那么这个权限是怎么来的呢?这就是umask干的事情。umask设置了用户创建文件的默认权限,它与chmod的效果刚好相反,umask设置的是权限“补码”,而chmod设置的是文件权限码。

也可以按照个人的偏好使用umask命 令来改变文件创建的缺省权限。相应的改变直到退出该shell或使用另外的umask命令之前一直有效。一般来说,umask命令是在/etc /profile文件中设置的,每个用户在登录时都会引用这个文件,所以如果希望改变所有用户的umask,可以在该文件中加入相应的条目。如果希望永久 性地设置自己的umask值,那么就把它放在自己$HOME目录下的.profile或.bash_profile或.bashrc文件中。

umask 命令允许你设定文件创建时的缺省模式,对应每一类用户(文件属主、同组用户、其他用户)存在一个相应的umask值中的数字。对于文件来说,这一数字的最大值分别是6。系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用chmod命令增加这一权限。目录则允许设置执行权限,这样针对目录来 说,umask中各个数字最大可以到7。

该命令的一般形式为:

umask nnn

其中nnn为umask置000-777。

如何计算umask值:

例如,对于umask值0 0 2,相应的文件和目录缺省创建权限是什么呢?

第一步,我们首先写下具有全部权限的模式,即777 (所有用户都具有读、写和执行权限)。

第二步,在下面一行按照umask值写下相应的位,在本例中是0 0 2。

第三步,在接下来的一行中记下上面两行中没有匹配的位。这就是目录的缺省创建权限。

稍加练习就能够记住这种方法。

第四步,对于文件来说,在创建时不能具有执行权限,只要拿掉相应的执行权限比特即可。

这就是上面的例子, 其中u m a s k值为0 0 2:

1) 文件的最大权限 rwx rwx rwx (777)

2) umask值为0 0 2 --- --- -w-

3) 目录权限 rwx rwx r-x (775) 这就是目录创建缺省权限

4) 文件权限 rw- rw- r-- (664) 这就是文件创建缺省权限

参考文献:百度百科“umask”

4.3 参考答案

此操作对系统管理员之外的用户。

4.4 参考答案

(略)

4.5 参考答案

Stat结构成员st_size表示以字节为单位的文件长度,此字段只对普通文件、目录文件和符号链接有意义。

对普通文件,其长度可以为0;

对目录,文件长度通常是一个数(例如16或215)的倍数。

[root@localhost 2014user]# ls -al temp

总用量 8

drwxr-xr-x 2 root root 4096 3月 7 10:03 .

drwxr-xr-x 3 root root 4096 3月 7 10:03 ..

对于符号链接,文件长度是文件名中的实际字节数。

所以对于目录和符号链接的文件长度不可能为0。

7.《Unix环境高级编程》第5章习题5.2、5.3、5.7 (p130)

目的:理解标准I/O缓冲区机制

解答:

5.2 参考答案

参考5.7节说明,fgets必须指定缓冲区的长度n,此函数一直读到下一个换行符为止或者缓冲区满(缓冲区总是以null字符结尾)。Fputs将一个以null符终止的字符串写到指定的流,尾端的终止符null不写出(注意,这并不一定是每次输出一行)。

在程序清单5-2中,如果将MAXLINE设得太小,这两个函数仍然正常工作,只不过被执行的次数要比MAXLINE值较大的时候多。

5.3 参考答案

根据5.11节中格式化输出printf()函数的定义,该函数将格式化数据写到标准输出,若执行成功则返回输出字符数,若输出出错则返回负值。

测试程序:

#include

int main(void){

int i;

i=printf("");

printf("%d",i);

return 0;

}

运行:

[root@localhost 2014user]# gcc -o testprintf testprintf.c

[root@localhost 2014user]# ./testprintf

0

5.7 参考答案

当程序交互运行时,标准输入和标准输出设备均为行缓冲方式。每次调用fgets时,标准输出设备将自动刷清。

进一步测试。