man 2システムコールはどのように呼び出されますか?

man 2システムコールはどのように呼び出されますか?

man 2 brkシステムコールとは、割り込みではないなどの機能を意味します0x80

わかったらこのスレッドコンパイルされたCプログラムは決してまっすぐシステムコールを呼び出します。で発生する可能性のあるライブラリ呼び出しのみを呼び出すことができますglibc

しかし、man 3 brk報酬がありますNo manual entry for brk in section 3。したがって、brk正しく実行するには、次のいずれかが発生する必要があります。

  1. 上記の私の理解が間違っています。プログラムはサポートなしでシステムコールを呼び出すことができますglibc。しかし、brkプログラムにどのように接続しますか?
  2. glibc実際にシステムコールのラッパーがありますbrk。それでは、brk私の時間には何が含まれますか#include <unistd.h>?一つかglibcシステムコールですか?それでは、glibcなぜ文書化されていないのですかman 3?利用可能な図書館通貨の完全なリストはどこにありますか?

ベストアンサー1

セクション2のマニュアルページのほとんどのシステムコールでは、マニュアルページは実際にCライブラリラッパーを説明しています。例外は通常明示的に言及されます。gettid@Sergei Kurenkovは答えで次のように言及しました。

ノートGlibcはこのシステムコールのラッパーを提供しません。これを呼び出すには、syscall(2)を使用してください。

pivot_root(通常のアプリケーションではあまり使用されていません)、tgkill(低レベル機能を実行するpthread_kill)と似ています。そしてそこにreaddir、実際のシステムコールはライブラリ関数と多少異なります。

説明するこれはあなたが興味を持っている機能ではありません。 POSIX準拠のCライブラリインタフェースについては、readdir(3)を参照してください。このページは、getdents(2)で置き換えられたベアカーネルシステムコールインターフェイスを文書化します。

一種のラッパーが必要です。関数呼び出しは、カーネルインタフェースの呼び出し規則とは異なるC呼び出し規則を使用して行われます。一般的な関数呼び出しはアセンブリ命令(または同様の命令)を使用して行われ、カーネル呼び出しはまたはを使用してcall行われます(または内容は含まれません)。コンパイラは、どの関数呼び出しが実際のカーネル呼び出しにマップされるかを知る必要はありません。syscallint 0x80gettimeofdaygetpidvdso

「一般的な」システムコールを使用しても、Cライブラリラッパーはデフォルトのシステムコールとは少し異なる動作をします。システムコールはエラーコードを別の負の値として返します(Linuxカーネルコードを見ると、多くのエラーが返されることがわかります)。 )のようなものreturn -EPERM;。 Cライブラリラッパーは、これらのすべての戻り値を-1に変換し、実際のエラーコードをerrno

おすすめ記事