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

答え2

コンパイルされたCプログラムは直接システムコールを実行しません。

これは本当ではありません。gettidたとえば、次のようにします。http://man7.org/linux/man-pages/man2/gettid.2.html。ラッパーがないため、プログラムは次の内容を作成する必要があります(man Glibc does not provide a wrapper for this system call; call it using syscall(2).:)。

#ifndef WIN32

#include <linux/unistd.h>
#include <sys/syscall.h>
#include <unistd.h>
int thread_gettid(void) {
    return static_cast<int>(syscall(SYS_gettid));
}
#else
int thread_gettid(void) {
    return GetCurrentThreadId();
}
#endif

上記の私の理解が間違っています。プログラムはglibcをサポートせずにシステムコールを呼び出すことができます。

実際にそうすることができます。それは以下を使用しますsyscallhttp://man7.org/linux/man-pages/man2/syscall.2.html

それでは、brkはどのようにプログラムに関連付けられていますか?

brkmanには次の行があるので、glibcにはラッパーがあるようです。

The return value described above for brk() is the behavior provided 
by the glibc wrapper function for the Linux brk() system call.

glibcなら、なぜman 3に記録がないのですか?

mallocメモリ割り当てを使用する必要があるためだと思います。

brk() と sbrk() の使用を避けてください。 malloc(3) メモリ割り当てパッケージは、移植可能で快適なメモリ割り当て方法です。

関連情報