同一系统调用如何在UNIX中接受不同的参数?

时间:2016-02-15 17:36:18

标签: c unix overloading system-calls

由于Unix是用C语言编写的,因此没有函数重载的概念。但是仍然可以使用不同的参数调用Unix系统调用。

示例:

open(fd, flag);
open(fd, flag, mode);

怎么可能?

3 个答案:

答案 0 :(得分:2)

我认为它可能使用可变长度参数。

例如。

int open(const char *path, int oflag, ...);

答案 1 :(得分:2)

它使用变量参数。

来自Red Hat Linux 5上的/usr/include/fcntl.h

extern int open (__const char *__file, int __oflag, ...) __nonnull ((1));

以下是一个如何运作的示例:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdarg.h>

int my_open(const char *file, int flag, ...)
{
    va_list va;

    if ((flag & O_CREAT) != 0) {
        va_start(va, flag);
        int mode = va_arg(va, int);
        va_end(va);
        printf("file=%s, flag=%d, mode=%o\n", file, flag, mode);
    } else {
        printf("file=%s, flag=%d\n", file, flag);
    }
}

int main()
{
    my_open("filename1", O_RDONLY);
    my_open("filename2", O_WRONLY | O_CREAT, 0644);
}

输出:

file=filename1, flag=0
file=filename2, flag=65, mode=644

答案 2 :(得分:-1)

因为它是在C89标准化之前编写的,编译器没有检查参数的正确性。函数声明如下

myfunc(a, b, c, d)
char *b;
int *c;
{

}

相当于今天的

int myfunc(int a, char *b, int *c, int d)
{

}