【问题标题】:What are the reasons to use "syscall" instead of calling the function directly?使用“系统调用”而不是直接调用函数的原因是什么?
【发布时间】:2012-08-30 10:34:10
【问题描述】:

syscall 允许在 Linux 中进行间接系统调用。使用它的原因是什么 - 为什么它比直接调用函数更好?

【问题讨论】:

    标签: c linux operating-system


    【解决方案1】:

    有时内核会添加系统调用,C 库需要一段时间才能支持它们。

    或者您正在旧的 Linux 发行版上编译,但想在较新的发行版上运行。

    示例代码:

    // syscall 277 is sync_file_range() on x86_64 Linux.  The header
    // files lack it on scc-suse10 where we compile, but the
    // performance benefits are substantial, so we just call it
    // directly.  FIXME someday.
    #define SYNC_FILE_RANGE_WRITE 2
        syscall(277, fd, done, n, SYNC_FILE_RANGE_WRITE);
    

    但总的来说,如果你的编译环境中的 C 库有你需要的东西,那么使用 syscall 并没有什么好处。 (一方面,它的可移植性甚至不如使用 Linux 特定接口,因为系统调用号因 CPU 而异。)

    【讨论】:

    • 它们不应因 CPU 而异,而应仅因操作系统实现而异。
    • @Wug:实际的系统调用数在 x86、x86_64、ARM、PPC 等上有所不同。
    • 那将是操作系统实现。它们不以任何方式依赖于 CPU,它们在某处的标头中定义并编译到内核中。
    • @Wug:问题是关于Linux“系统调用”功能,其“操作系统实现”因CPU而异。因此,“系统调用号因 CPU 而异”是完全准确的陈述。
    猜你喜欢
    • 2011-08-21
    • 2015-05-24
    • 2012-02-26
    • 2020-05-24
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 2013-06-16
    • 2020-01-12
    相关资源
    最近更新 更多