2

在 Windows 上,statWindows 提供的几乎所有其他 C/POSIX 函数都在 msvcrt.dll 中定义,这是 C 运行时库。

在 Linux 上,我知道很多 POSIX C 函数都是系统调用。我也知道在链接程序时,不能有未定义的引用。我已经在所有so文件中/lib搜索/usr/lib了符号stat或“损坏/前缀”形式,但没有找到任何东西。这是我使用的命令:

objdump -T /lib/*.so* /usr/lib/*.so* | grep "stat"

它没有出现stat我正在寻找的东西。

所以我的问题变成了:它在哪里,以及定义的任何其他“系统调用”?

4

4 回答 4

3

stat在我的Linux机器上,我可以__stat/usr/lib/libc.a

于 2012-06-09T09:02:57.723 回答
2

首先stat是模棱两可;有一个stat系统调用,并且有一个stat可以从调用系统调用的用户空间调用的函数。最后一个函数(至少在我的系统上)定义在/usr/include/sys/stat.h(没错,它在头文件中)。它实际上有几个定义(所有一个调用不同函数的衬里,例如__fxstat),根据编译器和系统以及诸如此类的东西选择其中一个。

无论如何,stat(和其他系统调用)只是调用内核的包装器(通常有很多编排)。这就是为什么我最初对你的意思感到困惑。我希望,尽管我的第一条评论没有帮助,但我可以提供帮助。

于 2012-06-09T09:09:37.490 回答
2

您甚至可以在不使用的情况下进行linux 内核 系统调用libc(但这可能是一种不好的做法)。Linux Assembly Howto解释(在其第 5 章和第6 章中)如何做到这一点(至少在 x86 Linux 32 位上)。

但我认为这是一个坏主意。通过libc是一种很好的做法,甚至可能更快(例如因为VDSO),并且更便携。

于 2012-06-10T13:50:02.547 回答
1

您可以使用syscall(2)调用它

#include <sys/syscall.h>
...
syscall(SYS_stat, path, buf);

另请参阅 Linux 系统调用参考:http ://syscalls.kernelgrok.com/

于 2012-06-10T14:23:30.367 回答