- 论坛徽章:
- 0
|
使用“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置位才读取第三个参数。 |
|