Chinaunix

标题: 突然想起来一个问题:关于open函数的原型。 [打印本页]

作者: DennisRitchie    时间: 2007-09-19 22:07
标题: 突然想起来一个问题:关于open函数的原型。
使用“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置位才读取第三个参数。
作者: naihe2010    时间: 2007-09-20 08:58
“带有两个参数的open是用来打开一个已经存在的文件,而带有三个参数的open是用来创建一个文件”

不对。

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

[ 本帖最后由 naihe2010 于 2007-9-20 09:00 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2