在Windows上,stat
和几乎所有其他C / POSIX函数Windows供应都是在msvcrt.dll中定义的,这是C运行时库。
在Linux上,我知道很多POSIX C函数都是系统调用。我也知道在链接程序时,你不能有未定义的引用。我搜索了so
和/lib
中的所有/usr/lib
个文件,搜索了符号stat
或“已修复/带前缀”的格式,但未找到任何内容。这是我使用的命令:
objdump -T /lib/*.so* /usr/lib/*.so* | grep "stat"
它没有出现我正在寻找的stat
。
所以我的问题变成:它在哪里,以及定义的任何其他“系统调用”?
答案 0 :(得分:3)
在我的Linux机器上,我可以在stat
中找到__stat
(弱)符号和/usr/lib/libc.a
(非弱)
答案 1 :(得分:2)
如果不使用libc
,您可能会linux kernel system calls(但这可能是一种不好的做法)。 Linux Assembly Howto解释了(在其第5章和第6章中)如何做到这一点(至少在x86 Linux 32位上)。
但我认为这是一个坏主意。通过libc
是很好的做法,甚至可能更快(因为例如VDSO),并且更便携。
答案 2 :(得分:1)
首先stat
含糊不清;有一个stat
系统调用,并且有一个函数stat
可以从调用系统调用的用户空间调用。最后一个函数(在我的系统上至少)在/usr/include/sys/stat.h
中定义(这是正确的,它在头文件中)。它实际上有几个定义(所有一个内容调用不同的函数,例如__fxstat
),其中一个是根据编译器和系统选择的。
无论如何,stat
(和其他系统调用)只是调用内核的包装器(通常有很多编排)。这就是为什么我最初对你的意思感到困惑。我希望,尽管我的第一次评论毫无帮助,但我能提供帮助。
答案 3 :(得分:1)
您可以使用syscall(2)
进行调用#include <sys/syscall.h>
...
syscall(SYS_stat, path, buf);
另请参阅Linux系统调用参考:http://syscalls.kernelgrok.com/