2

Windows では、statWindows が提供する他のほとんどすべての C/POSIX 関数は、C ランタイム ライブラリである msvcrt.dll で定義されています。

Linux では、多くの POSIX C 関数がシステム コールであることを知っています。また、プログラムをリンクするときに、未定義の参照を使用できないことも知っています。シンボルまたは「マングル/プレフィックス」形式のすべてのsoファイル/libを検索しましたが、何も見つかりませんでした。これは私が使用したコマンドです:/usr/libstat

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

stat探していたものは見つかりませんでした。

だから私の質問は次のようになります:それはどこにあり、他の「システムコール」は定義されていますか?

4

4 に答える 4

3

私の Linux マシンでは、stat(弱い) シンボルと__stat(非 弱い) シンボルを見つけることができます/usr/lib/libc.a

于 2012-06-09T09:02:57.723 に答える
2

を使用せずにLinux カーネル システム コールを実行することもできますlibc(ただし、これはおそらく悪い習慣です)。The Linux Assembly Howtoは、(その第 5 章と第 6 章で) その方法を説明しています (少なくとも x86 Linux 32 ビットで)。

しかし、それは悪い考えだと思います。を経由libcすることは良い習慣であり、( VDSO などにより)より高速になる可能性があり、移植性が高くなります。

于 2012-06-10T13:50:02.547 に答える
2

まず第一に、statあいまいです。システムコールがあり、システムコールを呼び出すユーザー空間から呼び出すことができるstat関数があります。stat最後の関数は (少なくとも私のシステムでは) で定義されています/usr/include/sys/stat.h(そうです、ヘッダー ファイルにあります)。実際にはいくつかの定義(たとえば、異なる関数を呼び出すすべての1つのライナー__fxstat)があり、そのうちの1つはコンパイラとシステムなどに応じて選択されます。

とにかく、stat(および他のシステムコール) は、カーネルを呼び出す単なるラッパーです (通常、多くのオーケストレーションを使用)。そのため、最初はあなたが何を意味するのか混乱していました。最初のコメントが役に立たなかったにもかかわらず、私が助けてくれることを願っています。

于 2012-06-09T09:09:37.490 に答える
1

syscall(2)で呼び出すことができます

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

Linux syscall リファレンスも参照してください: http://syscalls.kernelgrok.com/

于 2012-06-10T14:23:30.367 に答える