• ベストアンサー

システムコール

システム・コールをより使いやすい形にしたものが、ライブラリである。と解説されていたのですが、システムコールを使うときは手間がかかるんですか?例えばわかりやすい例をあげてもらえないでしょうか、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • gatyan
  • ベストアンサー率41% (160/385)
回答No.2

普通、システムコールは特定の言語に依存しない形で呼び出し方法やパラメーターの受け渡し方法が規定されています。 そのため、全て自力でコーディングしようとすると、とても面倒だったり、言語の規定する範囲では記述できないこともあります。 CPUのレジスタXXに値YYをセットする なんてことは、高級言語のソースの途中にアセンブラのコードを埋め込むようなことをしないとできません。 DOS用のCコンパイラの中には for(i=0;i<10;i++) { sprintf(msg,"%d",i); ASM mov ax,5 //呼び出し準備 ASM mov dx,msg //呼び出し準備 ASM int 21h //システムコール実行 } //ASMはアセンブラ記述を意味する拡張された言語仕様 のようにアセンブラ記述を埋め込めるモノもありますが… (コードは適当なので、意味ありません あしからず) また、そのようなことをする場合は、高級言語がどのようにレジスタやメモリを管理しているのかを熟知している必要もあります。 先の例では、axというレジスタがループ制御変数の i に割り当てられているかも知れないのと、システムコールの戻り値が渡されてくる可能性があります。つまり、レジスタaxがコンパイラでどのように使用されているのかを把握した上で、axの退避・復元をきちんとしないと暴走する可能性があります。 そんな面倒・間違いやすい・環境に強く依存する記述をするよりも、その言語の仕様にそった形で呼び出せるような関数・手続き(ライブラリ)として用意するほうが間違いが少なく、プログラムが書きやすくなります。

その他の回答 (1)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

システム・コールという言い方だと特権モードのOSサービスを呼び出すことになります。 これは通常はアセンブラでレジスタにパラメータやサービス番号を設定してCPUのトラップ命令(ソフトウェア割込み)を実行する形です。 C言語から実行するためにはサービスごと(UNIXやWindowsなど)かシステムコール汎用(DOSのシステムコール関数など)か、いずれかのラッパ関数を使います。どちらにせよ通常はライブラリで提供されるでしょう。 Windowsではシステムコールと言わずAPIという言い方になっています。これはOSサービスを必ずしも特権モードで実装せずライブラリ内だけで実装したりして効率化している部分があるからです。

関連するQ&A

  • ライブラリ・システムコールとは?

    ライブラリコール、システムコールについて要約して教えてもらえませんか?別に要約じゃなくてもいいですが(^_^.) あと、相違点などについても教えて下さい。 調べてもイマイチ分からないので。 宜しくお願いします。

  • システムコールと標準ライブラリの正しい使い方を教えて下さい

    システムコールって何でしょうか。 C言語初心者なので、変な質問だったら、すみません。 システムコールと標準ライブラリにおける、関数の違いを教えて頂けませんでしょうか。 例えばファイル入出力で用いる openとfopenは何が違うのでしょうか? 私はそもそも、システムコールというものが判っていない状態です。 いつも標準ライブラリを参考にしていたものですから・・。 更に似た使い方をすると思いますが、使える範囲等どちらが広いのでしょうか。 よろしくお願いします。

  • システムコールについて教えてください!

     私は機械工学を専攻しているのですが、大学の授業で情報学科のOSの授業に興味があり受講してみたものの、やはり知識不足で困っております。  つまったところは、「どのようなシステムコールがあるか」という問題です。  システムコールとは、ユーザがハードウェアを直接制御すること??なのでしょうか? 問題が「どのようなシステムコールがあるか?」ということなので、簡単な例をだして頂いて教えて頂ければ幸いです。よろしくお願い致します。

  • システムコールって何でしょうか?

    システムコールってなんでしょうか?

  • システムコールについて

    最近システムコールについて学んでいるのですが、C言語でprintfを実行するために必要なシステムコールを特定するにはどのようなさぎょうをすればよいでしょうか? はじめに適当なプログラムを作ってあるのですが、そのプログラムを工夫することによって特定するやり方でお願いします。

  • Windowsのシステムコール呼び出し

    アセンブラでシステムコールを呼び出したいのですが、 Linuxとかだとシステムコールの一覧みたいのが載ってるのですが、 Windowsのシステムコールの一覧みたいのが見つかりません。 一覧が載っているようなサイトってありませんか?? とりあえずLinuxの11番(C言語で言うexecv関数)みたいのが使いたいのですが。。。

  • Linux/Windowsのシステムコール

    CentOS 5.5 + Eclipse CDT で C++ のプログラミングを始めたばかりです。 プログラムを作成するにあたって、今後 Windows へ移植したときに移植しやすいプログラムを作成したいと考えています。 (現段階ではまだ標準出力に何か表示するお粗末なものですが) 素人考えでは、システムコールを使用すると他プラットフォームへ移植したときに同等のシステムコールがないと実装を大きく変更しなければならなくなるので、あらかじめどれが固有のシステムコールかを判断したいと思っています。 例えば Linux では待ち行列を実現するのに mkfifo システムコールが使えるけど、Windows では使えないから待ち行列をあらかじめロジックで実現しよう、という感じです。 (あくまで例なので、Windows の FIFO の API を使えばいいじゃん、というのはナシで) なので、Linux および Windows でシステムコール一覧を参照する方法を教えて頂きたいです。 まあ、STLでもプラットフォームが変われば動く保証はないみたいなので、Javaみたいなクロスプラットフォームのようにはいかないと思いますが。。。 よろしくお願いします。

  • システムコールをフックするという意味

    皆さん、こんにちは。 プログラミングを勉強中の大学生です。 タイトルどおりですが、システムコールをフックするとはどういった意味でしょうか? 別の質問をしたときに回答してくれた人が言っていました。 その人に聞く前に締め切ってしまい、追加の質問ができなくなってしまいました。 「フックする」というのがわかっていません。システムコールもよくわかりません。 WEBで検索しても持っている本を調べてもわかりませんでした。 具体例を交えて説明していただけるとうれしいです。 よろしくお願いします。

  • コールトラッキングシステムとは・・・

    コールトラッキングシステムとは、どんなシステムですか? 教えてください。

  • システムコールについて。

    アセンブリ言語で、int $0x80はシステムコールと言われていますが、Linuxを知らないとわかりません。システムコールはアプリとカーネルのインターフェースです。 x86 Linux 32bitのシステムコールの呼び出しは int 0x80です。 システムコールはEAXに格納されている数値でいろいろな処理ができます。 https://www.mztn.org/lxasm64/x86_x64_table.html を見ていただくとWRITEのsyscall#は4です。 mov $0x4,%eax でeaxに4を入れているので画面に出力したいのだとわかります。 WRITEの第2引数は画面に出力したい文字列が格納されているアドレスでECXに格納します。 mov %esp,%ecx とスタックポインターのアドレスをecxに入れています。 ESPは push eax でEAXに格納されている$0x616b6157(Waka)がスタックに退避しています。 WRITEの第3引数は文字数です。文字数はEDXに格納します。 mov $0x4,%edx と4が入っているので文字数は4です。 このプログラムを実行させると画面にWakaと表示して元の画面に戻ります。そのためのRETです。 C言語で書けばたった1行。 write(1,"Waka",4) これについて詳しく教えていただけないでしょうか?すみません。