如何以编程方式检测linux上是否存在系统调用?

时间:2015-01-03 04:22:55

标签: c linux system-calls

我正在尝试编译一个将在某个旧版本的内核上运行的C程序。我编译程序的内核与运行程序的内核版本不同。 如果我只在较新版本的内核上调用一个系统调用,程序会崩溃,还是返回一个错误值?

1 个答案:

答案 0 :(得分:4)

这取决于。很少直接调用系统调用(syscalls (2)手册页甚至记下了这一点);更常见的是使用诸如writereadopenclose等库包装器。如果您尝试对相关系统上不存在的系统调用使用包装函数,则包装器也可能不存在,在这种情况下,您的程序将无法通过运行时链接程序并且无法启动

另一方面,如果您通过syscall函数直接调用系统调用(或多或少),例如

syscall(SYS_write, fd, buffer, size);

而不是

write(fd, buffer, size);

如果您尝试调用不存在的系统调用,syscall将返回-1errno将设置为ENOSYS

如果你使用一个足够新的libc来包含一个内核,该内核已经足够老,不能支持相应的系统调用,那么包装函数可能会传递这个错误。检查有问题的包装函数的文档。