C標準ライブラリのどの関数がシステムコールを行うかを知る方法はありますか? open
、close
、およびmalloc
のようなものもありますが、そこには何らかの種類のリストがありますか?たとえば、strcpy
のようにシステムコールを作成するか、time.h
のいずれかの関数を作成しますか?C標準ライブラリとシステムコール
答えて
多くの場合、実行時間はシステムコールによって完全に支配されるため、パフォーマンスの観点から質問していると仮定します。
これはインプリメンテーションに依存しますが(システムコールが存在するかどうかはインプリメンテーションに依存します)、推論を推し進め、推測するには "システムコール"カーネルからユーザへの "権限の移行は、それが本当にすべてのシステムコールであるからです。
strcpy
の例を考えてみましょう。これは、ある配列(プロセスのメモリ空間内)から別の配列(メモリ空間内)に文字列をコピーします。それ以外のデータは含まれていないので、この操作の一環としてカーネル空間に入るのはかなり病理学的なことです。
一方、time
の機能をtime.h
から考えてみます。現在のシステム時間を返します。これは共有システムリソースなので、カーネルの現在の時刻の記録を読み込むためにカーネルスペースに入る必要があると考えられます。そして伝統的に、あなたは正しいでしょう。しかし現代版のLinuxは、少なくともいくつかのアーチでは、カーネルメモリのページをすべてのユーザプロセスに読み取り専用でマップします。ページには、システム時刻のようにカーネルだけが更新できる特定の情報が含まれていますが、プロセスは秘密のデータを漏らすことなく自由にユーザー空間から読み取ることができます。だから、これはもっと曖昧です。
は最後に、あなたは彼らが権限を施行する必要がある上の共有リソース(ファイルシステム)に対処するためが必ずしもユーザ対カーネル・ツー・ユーザーの移行を伴わなければならないことopen
またはunlink
などの事業を展開しています。
あなたの質問に答えるより実践的なアプローチが必要な場合は、興味のある各機能を呼び出す短いプログラムを作成し、strace
の下で実行するだけです。
'open'でもカーネルの移行は必ずしも必要ではありません。コンソールファイルハンドル(例えば「CONIN $」)を開いた場合、Windowsの古いバージョンでは、ユーザー・モード・スタブから返された(「現在のコンソールの入力ストリーム」を意味する)一定のハンドルを取得したいです。これがまだ真実かどうかはわかりません。 – arx
私は、POSIXに準拠 'open'のバージョンを想定しました。すでに開いて1に一致するファイルディスクリプタを返すされてどこにも近くに準拠... –
システムコールは、プログラムがカーネルと通信する必要がある場合に行われます。 strcpy
がシステムコールを行うのは非常に効率的ではないでしょう。コードが実行を停止し、コンテキストスイッチがあり、CPUの実行モードが変更され(より多くの権限を持つために)、インターハンドラハンドラが実行され、コードが続行されます。これは、OSがあなたのコードを混乱させた後や別のプロセスを実行することを決して決してしないと仮定しています(例えば、読み込みを待っている間)。
自分自身にこの質問をすることで、自分自身で質問に答えることができます:この機能を書くことはできますか? (実際には可能ですか?)自分でstrcpyを書くことはできますが、開いたり読むことはできません。あなた自身のfopenを書くことができますが、openを呼び出さなければなりません。
ウィキペディアにはlist of catagories for system callsがあります。システムコールがいつ必要になるかをあなたに教えてくれます。
Thisは、アセンブリでインターウォップを呼び出す方法を示しています(これは、そうするコードに到達できる唯一の場所です)。
+1は、私は「私はこの関数を記述することはできますか?」が好き教育ツールとしてのアプローチ私が与えた 'time'の例が完全には機能しないコーナーケースに注意してください。あなたが知っている場合(カーネルはこのようにあなたは、カーネルが提供するコードを使用する必要があります。ユーザ空間メモリ内の必要なデータをマッピングして、フォーマットを知って、あなたは 'time'を書く「でした」が、カーネルの詳細は変更することができますので、それは壊れやすいだろうあなたがシステムコールを避けたい場合) –
- 1. 異なるC++標準とリンクするC++標準ライブラリ
- 2. mingW内の標準Cライブラリ
- 3. Visual C++標準ライブラリのキーワード
- 4. Cの成熟標準ライブラリ
- 5. Calltree for C++標準ライブラリ
- 6. C標準ライブラリとC POSIXライブラリの相違点
- 7. レガシーC++ IOライブラリと標準化IOライブラリの違い
- 8. C標準ライブラリの内部作業
- 9. Cの標準データ構造ライブラリ?
- 10. C++標準ライブラリのboost :: optional alternative
- 11. C標準ライブラリの完全なオンラインリファレンス?
- 12. Visual C++標準ライブラリの警告
- 13. 標準ライブラリ `FILE`タイプ
- 14. HTML(5)とCSS(3)標準ライブラリ/ API?
- 15. 標準ライブラリのLuaBindバインディング?
- 16. SBCL標準ライブラリのマニュアル?
- 17. PHPライブラリ/標準出力
- 18. Pythonの標準ライブラリでオーバーライドメソッド
- 19. ココアタッチ静的ライブラリ - 標準フレームワーク
- 20. C++標準レイアウトと参照
- 21. ブロックスコープリンケージC標準
- 22. C標準
- 23. C++アプリケーションでのCライブラリの標準出力の使用
- 24. マイクロソフトvs. GNU C/C++標準ライブラリの実装
- 25. C++ 11標準状態のC++ 11標準
- 26. NDKで標準のC++ライブラリが見つかりません
- 27. C++の移植可能な標準構文原子操作ライブラリ
- 28. 関数C++の標準ライブラリ関数のオーバーロード
- 29. 異なるコンパイラでのC++標準ライブラリの実装
- 30. カスタム言語での標準的なCライブラリのサポート
これは、実装に依存する可能性が高いです。あなたが興味を持っている特定のシステムはありますか? – templatetypedef
ええ、それは私が恐れているものです。 : – theshadow322
malloc()は必ずしもシステムコールを行うわけではありません。 – tristan