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

lon*_*owk 2 c linux system-calls

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

Win*_*ute 6

那要看。直接调用系统调用的情况相当罕见(syscalls (2)手册页甚至记录了这一点);更常见的是使用库包装,例如writereadopenclose和其他人。如果您尝试对系统调用使用包装器函数,而该系统调用在相关系统上不存在,则包装器很可能也不存在,在这种情况下,您的程序将无法通过运行时链接器并无法启动.

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

syscall(SYS_write, fd, buffer, size);
Run Code Online (Sandbox Code Playgroud)

代替

write(fd, buffer, size);
Run Code Online (Sandbox Code Playgroud)

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

如果您使用libc足够新的内核来包含包装函数,并且内核足够旧以不支持相应的系统调用,则包装函数可能会传递此错误。检查相关包装函数的文档。