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

  首先把题目贴上来吧:

/***********
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. jquery ui 改写cloes事件

    htmlAjax:{//模板ajax请求参数设置项            url:"template/task/task_create.html",            data ...

  2. 使用idea创建maven的web项目

    如果是第一次打开软件直接点击 Create New Project ,如果之前已经打开过项目了,需要点击菜单中 File → New Project … 如下图: 选择 Maven module ,输 ...

  3. java中的链式编程

    听到链式编程听陌生的,但是写出来就感觉其实很熟悉 package test; public class Test { String name; String phone; String mail; S ...

  4. C# 创建线程的简单方式:异步委托 .

    定义一个委托调用的方法:TakesAWhile //定义委托要引用的方法 private static int TakesAWhile(int data, int ms) { Console.Writ ...

  5. CSS 之 内层div填充margin,外层div的背景色不会覆盖该margin

    外层元素(如div)中只有一个非空子元素,此时margin是被折叠了.两者之间取最大的margin值,表现在外层父元素上,而不是内层子元素. 注意: (1)只有垂直方向上才会出现此现象,水平方向不会出 ...

  6. Easier Done Than Said?

    Problem Description Password security is a tricky thing. Users prefer simple passwords that are easy ...

  7. MySQL(23):事务的隔离级别出现问题之 脏读

    1. 脏读 所谓的脏读就是指一个事务读取了另一个事务未提取的数据. 试想一下:a账户要给b账户100元购买商品,如果a账户开启一个事务,执行下面的update语句做了如下转账的工作: update a ...

  8. ArcEngine实现捕捉节点

    来自:http://blog.sina.com.cn/s/blog_4d0b75870100o960.html //获取最近的结点,然后在  OnMouseMove中显示 //pnt:鼠标移动点 // ...

  9. Oracle 11g R2 for Win7旗舰版(64位)的安装步骤

    1.下载Oracle 11g R2 for Windows的版本 下载地址:http://www.oracle.com/technetwork/database/enterprise-edition/ ...

  10. Linux公社资料库地址

    免费下载地址在 http://linux.linuxidc.com/用户名与密码都是http://www.linuxidc.com