C 如何安全地使用新的Linux功能?

C 如何安全地使用新的Linux功能?,c,linux,C,Linux,我正在编写使用sched_setaffinity的代码,这需要内核2.5.8或更高版本。我一直在想这些事情是否可行: 使用旧内核的系统可以优雅地编译此代码,可能只是完全忽略了该代码段 如果我向具有旧内核的人发送一个已编译的二进制文件,它将跳过此函数或只是打印一条警告 我想我的问题是,在使用旧系统时,如何安全地使用新的内核函数而不破坏整个应用程序?使用dlopen()和NULL作为文件名,以及dlsym()您想要使用的函数。如果dlsym()成功,请通过返回的函数指针调用该函数。您是想让程序链接还

我正在编写使用sched_setaffinity的代码,这需要内核2.5.8或更高版本。我一直在想这些事情是否可行:

  • 使用旧内核的系统可以优雅地编译此代码,可能只是完全忽略了该代码段
  • 如果我向具有旧内核的人发送一个已编译的二进制文件,它将跳过此函数或只是打印一条警告
    我想我的问题是,在使用旧系统时,如何安全地使用新的内核函数而不破坏整个应用程序?

    使用
    dlopen()
    NULL
    作为文件名,以及
    dlsym()
    您想要使用的函数。如果
    dlsym()
    成功,请通过返回的函数指针调用该函数。

    您是想让程序链接还是运行?您可以通过glibc
    syscall()
    函数直接调用系统调用,而不需要最新的C库。显然,在没有支持的早期系统上,它会失败(快速测试显示,对于未实现的系统调用号,内核返回-1==ENOSYS),因此您需要进行测试。

    不要再担心2.5内核系列和之前的任何事情。任何仍在使用这些设备的人都应该被送进精神病院或其他什么地方:)@Nikolai:相当多的嵌入式Linux设备仍然运行2.4.x。我相信它们确实运行。他们还仔细地构建了一组非常有限的userland二进制文件,因此目标组在这里不是问题。与内核相比,链接的
    libc
    版本会有更多的问题。正如其他人指出的,您可以尝试调用一个不存在或未实现的系统调用,您将得到
    ENOSYS
    。即使符号在libc中,调用仍然可能失败,而
    ENOSYS
    。这是不必要的复杂。只需使用syscall()。这两个选项听起来都不错。据我所知,dlopen/dlsym()检查函数是否存在。syscall()只是通过glibc调用linux系统调用的另一种方法。然而,为什么要使用syscall呢?除了添加另一层抽象之外,这还能做什么?这个解决方案看起来很有希望,我只是想确保它不会做任何其他不需要的事情。啊……看来我自己已经找到了答案。此网站很好地解释了syscall的动机:。这听起来最好,因为dlopen/dlsym在这方面似乎不太可靠@安第罗斯