APUE习题8.7
看书的时候发现这个习题没有答案,于是就想把自己做的结果贴上来,和大家分享分享!
首先把题目贴上来吧:
/***********
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的更多相关文章
- APUE习题3.2用dup实现dup2以及shell中重定向符号的使用
习题3.2的要求是不使用fcntl()而编写一个同dup2()功能相同的函数.直觉上是不断使用dup()直到返回指定的文件描述符. #include <stdio.h>#include & ...
- APUE 习题3-2 实现dup2,要求不使用fcntl函数。
int mydup2(int oldfd, int newfd) { int tfd = 0; if (newfd < 0) { err_sys(&quo ...
- 【转】APUE习题4.6---测试lseek作用
原文网址:http://m.blog.csdn.net/blog/u014488381/42556509 原题:如果使用追加标志打开一个文件以便读.写,能否仍用 lseek 在任一为止开始读?能否用 ...
- APUE习题5.x
5.4 下面的代码在一些机器上运行正确,而在另外一些机器运行时出错,解释问题所在? #include <stdio.h> int main( void ) { char c; while( ...
- 文件IO 练习题
3.1 当读/写磁盘文件时,本章中描述的函数是否具有缓冲机制?请说明原因. 3.1 所有的磁盘 I/O 都要经过内核的块缓冲区(也称为内核的缓冲区高速缓存),唯一例 外的是对原始磁盘设备的 I/O,但 ...
- Implementing Software Timers - Don Libes
在看APUE习题10.5的时候提示了这篇文章,讲的非常清晰,设计也非常巧妙,所以把原文放在这里.值得自己去实现. Title: Implementing Software Timers By ...
- 【转】《APUE》第三章笔记(4)及习题3-2
原文网址:http://www.cnblogs.com/fusae-blog/p/4256794.html APUE第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. ...
- 《APUE》第三章笔记(4)及习题3-2
APUE第三章的最后面给出的函数,现在还用不着,所以,先留个名字,待到时候用着了再补上好了. dup和dup2函数:用来复制文件描述符的 sync函数,fsync函数和fdatasync函数:大致的功 ...
- apue第4章习题
4.1 用 stat 函数替换图 4-3 程序中的 lstat函数,如若命令行残数之一是符号链接,会发生什么变化? stat不支持链接,如果有参数是链接符号,会显示链接后的文件属性. 4.2 如果文件 ...
随机推荐
- DataGridView重绘painting简单实例
private void dataGridViewX1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) { & ...
- 将远程数据库中的某表数据复制到本数据库(ORACLE)
1. 建立 DATABASE LINKCREATE PUBLIC DATABASE LINK ABCCONNECT TO SA IDENTIFIED BY PASSWORDUSING '(DESCRI ...
- python3.x爬取美团信息
在之前的文章中,笔者有提到,我们要在实践中去学习python,笔者有天就想着要不要爬点东西呢,跃跃欲试的节奏啊,想来想去,想到美团了,那么首先笔 者想给自己确定一个目标,就是我要爬什么样的数据,我要爬 ...
- Android消息推送完美方案
转自:http://bbs.hiapk.com/thread-4652657-1-1.html 推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原 ...
- 2. Android框架和工具之 Volley
Java基础知识强化之网络编程笔记23:Android网络通信之 Volley(Google开源网络通信库)
- struts2 零配置
一.新建一个web项目,命名为:struts2 二.导入strut2所需的jar包 所需jar下载:http://pan.baidu.com/s/1dDxP4Z3 三.配置struts2的启动文件,在 ...
- spring事务管理出错。No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy ...
- log4net日志文件名输出格式化
日志文件输出格式: 20130626.txt20130627.txt20130628.txt20130629.txt <appender name="rolling" typ ...
- [转]在PHP语言中使用JSON
本文转自:http://www.ruanyifeng.com/blog/2011/01/json_in_php.html 作者: 阮一峰 日期: 2011年1月14日 目前,JSON已经成为最流行的数 ...
- poj 1390 动态规划
思路: 黑书的例题 #include<iostream> #include<cstring> #include<algorithm> #include<cma ...