• ベストアンサー

システムコール

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

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

  • ベストアンサー
  • 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