如何以编程方式检测 linux 上是否存在系统调用?
How to detect if a syscall exists on linux programmatically?
我正在尝试编译将在某些旧版本内核上运行的 C 程序。我编译程序的内核版本与我的程序将要运行的内核版本不同。
如果我只在较新版本的内核上调用系统调用,程序会崩溃,或者 return 一个错误值吗?
这取决于。直接调用系统调用的情况很少见(syscalls (2)
手册页甚至记录了这一点);更常见的是使用 write
、read
、open
、close
等库包装器。如果您尝试对相关系统上不存在的系统调用使用包装器函数,则包装器很可能也不存在,在这种情况下,您的程序将无法通过运行时链接器并无法启动.
另一方面,如果您直接通过 syscall
函数调用系统调用(或多或少),例如
syscall(SYS_write, fd, buffer, size);
而不是
write(fd, buffer, size);
然后 syscall
将 return -1
如果您尝试调用不存在的系统调用,并且 errno
将设置为 ENOSYS
。
如果您使用足够新的 libc
来包含包装函数,而内核太旧以至于不支持相应的系统调用,则包装函数可能会传递此错误。检查相关包装函数的文档。
我正在尝试编译将在某些旧版本内核上运行的 C 程序。我编译程序的内核版本与我的程序将要运行的内核版本不同。 如果我只在较新版本的内核上调用系统调用,程序会崩溃,或者 return 一个错误值吗?
这取决于。直接调用系统调用的情况很少见(syscalls (2)
手册页甚至记录了这一点);更常见的是使用 write
、read
、open
、close
等库包装器。如果您尝试对相关系统上不存在的系统调用使用包装器函数,则包装器很可能也不存在,在这种情况下,您的程序将无法通过运行时链接器并无法启动.
另一方面,如果您直接通过 syscall
函数调用系统调用(或多或少),例如
syscall(SYS_write, fd, buffer, size);
而不是
write(fd, buffer, size);
然后 syscall
将 return -1
如果您尝试调用不存在的系统调用,并且 errno
将设置为 ENOSYS
。
如果您使用足够新的 libc
来包含包装函数,而内核太旧以至于不支持相应的系统调用,则包装函数可能会传递此错误。检查相关包装函数的文档。