看书的时候发现这个习题没有答案,于是就想把自己做的结果贴上来,和大家分享分享!

  首先把题目贴上来吧:

/***********
8.10节中提及POSIX.1要求在调用exec时关闭打开的目录流。按下列方法对此进行验证,对根目录调用opendir,查看在你的系统上实现的DIR结构,然后打印执行时关闭标志。接着open同一目录读取并打印执行时关闭标志
***********/

  首先说,关于执行时关闭标志的作用,JesseEisen的这篇博客已经讲解的非常好了,(传送门在这里)我就不在这里献丑了,我想讲的是opendir和open函数的一点区别。

  opendir函数在打开目录流的的时候是设置了close-on-exec(执行时关闭)标志的,open函数则没有。

  具体来看这段代码:

 /***
这里的err_exit()函数是我自己定义的,功能就是调用strerror()函数打印出错误信息,并且调用exit()函数退出!
***/ #include<dirent.h>
#include<errno.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>
#include<stdarg.h>
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
void err_exit(char *fmt,...);
int main(int argc,char *argv[])
{
DIR *dirp;
int dir_fd;
int val; /*用opendir的方式打开目录,并且获取文件描述符,然后查看其close-on-exec标志*/
if(NULL == (dirp=opendir("/")))
err_exit("[opendir]: ");
if(- == (dir_fd=dirfd(dirp))) //获取打开目录流的文件描述符
err_exit("[dirfd]: ");
if(- == (val=fcntl(dir_fd,F_GETFD)))
err_exit("[fcntl]: "); printf("%-9s: ","[opendir]");
if(val & FD_CLOEXEC)
printf("close-on-exec flag is on\n");
else
printf("close-on-exec flag is off\n"); if(- == closedir(dirp))
err_exit("[closedir]: "); /*用open的方式打开目录,然后查看其close-on-exec标志*/
if(- == (dir_fd=open("/",O_DIRECTORY))) //open函数加上O_DIRECTORY标志就能够打开目录了
err_exit("[open]: ");
if(- == (val=fcntl(dir_fd,F_GETFD)))
err_exit("[fcntl]: "); printf("%-9s: ","[open]");
if(val & FD_CLOEXEC)
printf("close-on-exec flag is on\n");
else
printf("close-on-exec flag is off\n"); if(- == close(dir_fd))
err_exit("[close]: "); return ;
}

  这段代码功能就是这样的:

  首先通过opendir函数打开一个目录,然后通过dirfd函数提取出目录流的文件描述符,然后再利用fcntl获取close-on-exec标志。

  接着再来通过open函数(增加了O_DIRECTORY标志就能打开目录了,详见open(2))打开同一个目录,然后再来通过fcntl函数来查看它的close-on-exec标志。

  程序的运行结果如下:

  

  从结果中我们可以看到,opendir打开的目录流拥有close-on-exec标志位,而open函数打开的目录流没有close-on-exec标志位,这正好印证了APUE8.10节的叙述:

  

APUE习题8.7的更多相关文章

  1. APUE习题3.2用dup实现dup2以及shell中重定向符号的使用

    习题3.2的要求是不使用fcntl()而编写一个同dup2()功能相同的函数.直觉上是不断使用dup()直到返回指定的文件描述符. #include <stdio.h>#include & ...

  2. APUE 习题3-2 实现dup2,要求不使用fcntl函数。

    int mydup2(int oldfd, int newfd) {     int tfd = 0;     if (newfd < 0)     {         err_sys(&quo ...

  3. 【转】APUE习题4.6---测试lseek作用

    原文网址:http://m.blog.csdn.net/blog/u014488381/42556509 原题:如果使用追加标志打开一个文件以便读.写,能否仍用 lseek 在任一为止开始读?能否用 ...

  4. APUE习题5.x

    5.4 下面的代码在一些机器上运行正确,而在另外一些机器运行时出错,解释问题所在? #include <stdio.h> int main( void ) { char c; while( ...

  5. 文件IO 练习题

    3.1 当读/写磁盘文件时,本章中描述的函数是否具有缓冲机制?请说明原因. 3.1 所有的磁盘 I/O 都要经过内核的块缓冲区(也称为内核的缓冲区高速缓存),唯一例 外的是对原始磁盘设备的 I/O,但 ...

  6. Implementing Software Timers - Don Libes

         在看APUE习题10.5的时候提示了这篇文章,讲的非常清晰,设计也非常巧妙,所以把原文放在这里.值得自己去实现. Title: Implementing Software Timers By ...

  7. 【转】《APUE》第三章笔记(4)及习题3-2

    原文网址:http://www.cnblogs.com/fusae-blog/p/4256794.html APUE第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. ...

  8. 《APUE》第三章笔记(4)及习题3-2

    APUE第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. dup和dup2函数:用来复制文件描述符的 sync函数,fsync函数和fdatasync函数:大致的功 ...

  9. apue第4章习题

    4.1 用 stat 函数替换图 4-3 程序中的 lstat函数,如若命令行残数之一是符号链接,会发生什么变化? stat不支持链接,如果有参数是链接符号,会显示链接后的文件属性. 4.2 如果文件 ...

随机推荐

  1. JS控制输入框长度

    // 获取字符串的字节长度 function len(s) { s = String(s); return s.length + (s.match(/[^\x00-\xff]/g) || " ...

  2. 3.3html学习笔记之链接

    iframe 元素会创建包含另外一个文档的内联框架 <iframe src=""/> 跳转链接 <a href="#here" target= ...

  3. Python练习题 026:求100以内的素数

    [Python练习题 026] 求100以内的素数. ------------------------------------------------- 奇怪,求解素数的题,之前不是做过了吗?难道是想 ...

  4. 1.5.3 什么是Tokenizer-分词

    什么是Tokenizer-分词 分词器的工作就是分解文本流成词(tokens).在这个文本中,每一个token都是这些字符的一个子序列.一个分析器(analyzer)必须知道它所配置的字段,但是tok ...

  5. [JavaEE] Hibernate ORM

    一. Hibernate的简要介绍 Hibernate是轻量级Java EE应用的持久层解决方案,Hibernate不仅管理者Java类到数据库表的映射(包括Java 数据类型到SQL数据类型的映射) ...

  6. Stream Collector

    // Accumulate names into a List List<String> list = people.stream().map(Person::getName).colle ...

  7. Read / Write Excel file in Java using Apache POI

    Read / Write Excel file in Java using Apache POI 2014-04-18 BY DINESH LEAVE A COMMENT About a year o ...

  8. C#中Dictionary小记

    使用C#中Dictionary的一下细节小记: 一.Dictionary.Add(key,value) 与 Dictionary[key]=value的区别: 如果Dictionary中已经有了key ...

  9. 跨越跳板机传文件nc

    从线上服务器与本机互传文件 传输方 nc -l 10000 < a.tar 接收方 nc xx.xx.xx.xx 10000 >a.tar 原理: 文件传输方运行nc,指定端口,设置监听文 ...

  10. 文本替换sed+字段处理cut,join+awk重新编排字段

    [1]sed工具(Stream Editor)--流编辑器 sed 本身也是一个管线(管道)命令,可以分析 standard input 的啦! 而且 sed 还可以将数据进行取代.删除.新增.截取特 ...