课后题解答参考
- 格式: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时,标准输出设备将自动刷清。
进一步测试。