Chinaunix
标题:
突然想起来一个问题:关于open函数的原型。
[打印本页]
作者:
DennisRitchie
时间:
2007-09-19 22:07
标题:
突然想起来一个问题:关于open函数的原型。
使用“man 2 open”,可以看到open函数的原型如下:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
复制代码
带有两个参数的open是用来打开一个已经存在的文件,而带有三个参数的open是用来创建一个文件,比如说:
int main()
{
int exist = open("/etc/passwd", O_RDWR);
int new = open("/tmp/123456", O_CREAT | O_RDWR, 0666);
return 0;
}
复制代码
今天突然想起来一个问题:open函数的原型是什么了?open函数是可以在C语言中被直接调用的,但是C语言是不支持C++的函数名称重载,因此,在fcntl.h文件中,open的原型应该不是像man文档中那样申明的:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
复制代码
这样申明的话,就没法通过编译了。
后来查了下fcntl.h文件,发现open函数的申明中使用了C语言的缺省参数:
int open(const char *file, int flags, ...)
复制代码
我想open函数的实现如下:
int open(const char *file, int flags, ...)
{
mode_t mode;
va_list ap;
if (flags & O_CREAT) {
va_start(ap, flags);
mode = va_arg(ap, mode_t);
va_end(ap);
}
return open系统调用(file, flags, mode);
}
复制代码
在这里需要注意三点:
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