免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3586 | 回复: 1
打印 上一主题 下一主题

[函数] 突然想起来一个问题:关于open函数的原型。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-19 22:07 |只看该作者 |倒序浏览
使用“man 2 open”,可以看到open函数的原型如下:

  1.        int open(const char *pathname, int flags);
  2.        int open(const char *pathname, int flags, mode_t mode);
复制代码

带有两个参数的open是用来打开一个已经存在的文件,而带有三个参数的open是用来创建一个文件,比如说:

  1. int main()
  2. {
  3.         int exist = open("/etc/passwd", O_RDWR);
  4.         int new = open("/tmp/123456", O_CREAT | O_RDWR, 0666);
  5.         return 0;
  6. }
复制代码

今天突然想起来一个问题:open函数的原型是什么了?open函数是可以在C语言中被直接调用的,但是C语言是不支持C++的函数名称重载,因此,在fcntl.h文件中,open的原型应该不是像man文档中那样申明的:

  1.        int open(const char *pathname, int flags);
  2.        int open(const char *pathname, int flags, mode_t mode);
复制代码

这样申明的话,就没法通过编译了。

后来查了下fcntl.h文件,发现open函数的申明中使用了C语言的缺省参数:

  1. int open(const char *file, int flags, ...)
复制代码


我想open函数的实现如下:

  1. int open(const char *file, int flags, ...)
  2. {
  3.     mode_t mode;
  4.     va_list ap;

  5.     if (flags & O_CREAT) {
  6.         va_start(ap, flags);
  7.         mode = va_arg(ap, mode_t);
  8.         va_end(ap);
  9.     }
  10.     return open系统调用(file, flags, mode);
  11. }
复制代码

在这里需要注意三点:
1、open库函数的原型申明采用了可变参数,并不是像man中那样存在有两个open函数。
2、open系统调用的原型有3个参数:open(file, flags, mode)
3、open库函数通过flags中的O_CREAT位判别是否有第三个参数,如果O_CREAT置位才读取第三个参数。

论坛徽章:
0
2 [报告]
发表于 2007-09-20 08:58 |只看该作者
“带有两个参数的open是用来打开一个已经存在的文件,而带有三个参数的open是用来创建一个文件”

不对。

是否创建,由第二个参数中O_CREAT指定。而第三个,是mode,与是否创建无关。

[ 本帖最后由 naihe2010 于 2007-9-20 09:00 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP