我试图找到 sync(2)
的 Linux 3.2.21 x86_64 实现在 unistd.h header 中声明的 Unix 函数。查看 Linux unistd.h 会产生以下原型(prototype):
/* Make all changes done to all files actually appear on disk. */
extern void sync (void) __THROW;
所以我认为这意味着 sync
是在 Linux 内核之外定义的,并且在 glibc 2.7 内部定义,这在 glibc-2.17/misc/sync.c 中给了我这个定义| :
/* Make all changes done to all files actually appear on disk. */
void
sync ()
{
__set_errno (ENOSYS);
}
所以这意味着 sync
除了设置 errno
的值外什么都不做。
但是,当我在系统上反汇编 /usr/lib/x86_64-linux-gnu/libc.a 时,我发现 sync 部分进行了系统调用,传递值 162
(所以它正在做某事)。
再次查看 Linux 源代码 arch/x86/include/asm/unistd_64.h ,我明白了:
#define __NR_sync 162
__SYSCALL(__NR_sync, sys_sync)
现在我真的很困惑。
如果 sync(2)
是在 Linux 之外定义的,为什么会有系统调用呢? x86_64 架构的 sync
定义在哪里?
P.S.:我确实在 arch/x86/kernel/syscall_64.c 找到了 __SYSCALL
的预处理器定义,但这似乎意味着 sync
系统调用只是调用一个声明为 void sys_sync(void)
的外部函数。这个函数的定义在哪里?
最佳答案
您正在寻找 fs/sync.c
。见:
SYSCALL_DEFINE0(sync)
{
...
您发布的 glibc
版本可能是在内核不公开 sync
系统调用的非常尴尬的情况下编译的。换句话说,它是一个几乎从未使用过的 stub 。
关于c - x86_64 处理器的 sync(2) Linux 函数调用的定义在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15507185/