Linux open() 一个函数,两个函数原型
2018-01-08 15:57
309 查看
open在手册中有两个函数原型, 如下所示:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
这样的函数原型有些违背了我们的直觉。
C语言是不支持函数重载的, 为什么open的系统调用可以有两个这样的open原型呢? 内核绝对不可能为这个功能创建两个系统调用。
在Linux内核中, 实际上只提供了一个系统调用, 对应的是上述两个函数原型中的第二个。 那么open有两个函数原型又是怎么回事呢?
当我们调用open函数时, 实际上调用的是glibc封装的函数, 然后由glibc通过自陷指令,
进行真正的系统调用。 也就是说, 所有的系统调用都要先经过glibc才会进入操作系统。 这样的话, 实际上是glibc提供了一个变参函数open来满足两个函数原型,
然后通过glibc的变参函数open实现真正的系统调用来调用原型二。
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
这样的函数原型有些违背了我们的直觉。
C语言是不支持函数重载的, 为什么open的系统调用可以有两个这样的open原型呢? 内核绝对不可能为这个功能创建两个系统调用。
在Linux内核中, 实际上只提供了一个系统调用, 对应的是上述两个函数原型中的第二个。 那么open有两个函数原型又是怎么回事呢?
当我们调用open函数时, 实际上调用的是glibc封装的函数, 然后由glibc通过自陷指令,
进行真正的系统调用。 也就是说, 所有的系统调用都要先经过glibc才会进入操作系统。 这样的话, 实际上是glibc提供了一个变参函数open来满足两个函数原型,
然后通过glibc的变参函数open实现真正的系统调用来调用原型二。
相关文章推荐
- 习题 8.17 写一函数,实现两个字符串的比较。即自己写一个strcmp函数,函数原型为int strcmp(char *p1, char *p2);
- Linux编程:创建一个只包含两个函数的小型静态函数库
- 1. 给定两个整形变量的值,将两个值的内容进行交换。 2. 不允许创建临时变量,交换两个数的内容(附加题) 3. 求10 个整数中最大值。 4. 写一个函数返回参数二进制中 1 的个数
- 剑指offer—写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
- 在Linux下利用替换函数(exec函数家族)写一个简单的myshell
- 头文件里面实现一个函数,在两个cpp中包含,则重复定义,如果加上inline则不会报错
- 手把手地写了一个函数,计算出两个字符串日期之间的所有字符串型日期 集合
- 习题 7.6 写一个函数,将两个字符串连接。
- Linux下使用两个线程协作完成一个任务的简易实现
- Objective-C - 写一个函数实现求两个数的和(要求两个加数由用户从控制台输入)
- unprotoize命令_Linux unprotoize 命令用法详解:删除C语言源代码文件中的函数原型
- 自定义一个strcmp函数。 函数原型为 strcmo(char *p1,char *p2);
- 两个线程同时调用同一个处理函数的互斥问题
- 一个解决方案中有两个项目,一个项目调用另一个项目中的函数
- 关于栈的弹出函数设计是否应该有两个返回值,一个表示数据,一个表示是否栈为空
- linux中open函数使用
- 警告: 函数声明不是一个原型 [-Wstrict-prototypes]
- 给出一个函数来合并两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠
- 题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。
- Linux 运行参数 一个减号与两个减号