No.3ベストアンサー
- 回答日時:
システムコールは本来はOSが提供する機能をほぼそのまま呼び出すものです。
OSによっては呼び方が違うこともあります(スーパバイザコールとか)ほぼ、と書いたのは実際には各言語から直接呼び出せるとは限らないからです。
だいたいはアセンブラレベルで定義されてます。
OSの機能そのままなので、OSによっては全く違いますし、該当する機能がない場合もあります。
openは本来 unix系のOSが提供する機能そのものです。
ですので、同じunix系であっても細かい違いがあります。
MS-DOS等でもopenはありますが、これは本来システムコールではなく、unix系OSのシステムコール互換ライブラリになります。
これに対して fopenはC言語レベルで共通に使えるように作られたサブルーチンで、
基本的にOS等に依存しないで使えるように作られたものです。
中身は勿論OSによって違ってきますが、使い方はほぼ同じです。
厳密にはパラメタの内容に違いがありますし、
動きもOSに依存する違いが出てくる場合もありますが。
C言語で書く場合は標準ライブラリのみ使用していると、OS等が違ってもほぼそのまま動くプログラムを書くことができますが、
システムコールを使った場合はまずOSが異なった場合は、
たいていなんらかの書き換えが必要になります。
但し、標準ライブラリだと共通に使うことが目的なため、用途によっては機能的に足らない場合もあります。
単純に使える範囲では標準ライブラリの方が広いですね。
機能としては似ている物もありますが、通常は使い方は区別する方がいいですね。
特に問題、不自由なければ標準ライブラリを使うことをおすすめします。
プログラムいろいろ作っていくとシステムコールでなければできない場合がありますから、
システムコールはその時に使えばいいでしょう。
例えば私はWindowsのプログラムを書く場合でも、通常 fopen等を使いますが、
必要な場合はFileCreate等(WIN32API,システムコールと同等)を使います。
No.4
- 回答日時:
既に出ている回答で良いと思うのですが、他の回答者の方々が忘れておられる
かもしれない側面について補足しておきます。
UNIXは、タイムシェアリングシステム、すなわち1台のコンピュータを複数の
人が共有して使うやり方を想定して作られました。コンピュータを扱う人と
プログラマが同義語だった時代です。ある人の作ったプログラムが他の人の
プログラムを妨害しては困ります。ですので、共通の資源の管理、ディスクの
入出力とかプロセスの生成といったことは特権モードで一括して行うように
しました。ユーザーのプログラムは、この特権モードのルーチンを呼び出す
ことによって資源を割り当ててもらい、必要な処理を行います。これが
システムコールです。
一方、多くのプログラマが共通に使うルーチンだけれども、必ずしも特権を
必要としない処理もあります。数学の関数の計算などが代表的なものです。
入出力についても、物理的な入出力自体は特権が必要であっても、それに
関する処理、例えばバッファリングですとか出力文字列のフォーマッティング
などは特権を必要としません。ですので、これらの処理は非特権モードで
実行し、必要に応じて共通ルーチンの中からシステムコールを行うように
なっています。これが標準ライブラリのわけです。
No.2
- 回答日時:
システムコールと標準ライブラリの違いは、プラットフォームによって話が違ってくるので、一概に「こう」とは言いきれないのですが。
元々、C言語は unix で使われていたので、まずはその部分から。
unix 上のCでは、システムコール関数を呼び出すと、渡されたパラメータをそのままカーネルシステムに渡し、結果が返って来るまで待って、アプリケーションに結果を返します。
ところが、unix には BSD 系の OS と SYSTEM-V 系の OS と2種類の体系があり、また、同じ系列の unix でも機種による違い(方言)があり、パラメータや結果の返り方が微妙に違っているシステムコールがあります。
そうなると、機種ごとの微妙な違いを吸収する為の「標準的な何か」が必要になって来ます。
そこで用意されたのが、標準ライブラリです。
標準ライブラリは、unix の体系ごと、各機種ごとに合わせた物が用意され、出入り口のインターフェースが統一されています。OS の仕様の違いはライブラリ関数内で吸収されます。
そうする事により、システムコールを使わず標準ライブラリのみ使っていれば、OS の仕様が微妙に異なるシステムに移植する作業が安易になります。
(実行ファイル作成時に、機種ごとに用意されたライブラリファイルのどれを使うか指定するだけで済みます)
ただ、標準ライブラリのみを使っていると、移植が安易になる反面、OS の仕様の違いを吸収する為のオーバーヘッドがあり、速度的に遅くなる、実行コードが大きくなると言う短所があります。
その為、速度重視、コードサイズ重視で設計する場合や、やりたい事が標準ライブラリに無くシステムコールするしか無い場合もあり、システムコール関数を使わずに済ます事は出来ません。
そういった経緯で、C言語にはシステムコール関数と標準ライブラリ関数の両方が存在します。
で、時代は unix から MS-DOS へと移って行きます。そして、C言語のシステムコール関数と標準ライブラリ関数の意味合いも、OS の違いと共に移り変わって行きます。
unix と MS-DOS では、カーネルシステムそのものがまったく違います。でも、unix 上で開発したソースコード資産を無駄にはしたくありません。
そこで、unix 用のシステムコール関数と同じような動きをする関数が MS-DOS 用のライブラリとして用意され、同じく、標準ライブラリ関数も用意されました。そうすれば、unix から MS-DOS への移植が容易になりますから。
つまり、OS の違いをシステムコール関数内で吸収してしまった訳です。標準ライブラリ関数が unix の微妙な違いを関数内で吸収したのと同じような事をした訳ですね。
(ファイルの「テキスト」「バイナリ」の概念も、ここで取り入れられました。unix と MS-DOS の「改行コード」の違いを吸収する為、テキストファイルを読む場合は CR+LF を LF に、書く場合は LF を CR+LF に変換する必要があったのです。アプリケーションは「改行は LF のみ」として作られている訳ですから)
そういった訳で、MS-DOS 用のC言語では、システムコール関数と標準ライブラリ関数の違いが曖昧になりました。どちらも「OS の違いを関数内で吸収し、インターフェースを統一している」訳ですから。
そんな訳で「システムコール(関数)と標準ライブラリ(関数)における、関数の違いって何?」と言う疑問が湧くのも当然です。
(Windows のコンソールアプリケーションを含む)MS-DOS 系では、パラメータが違うだけで、内部でやっている事は同じような事なのですから。
「使える範囲等どちらが広いか」ですが、ここまで読んでお判りかと思いますが、標準ライブラリ関数の方が機種依存性は低く広範囲に使えます。但し、痒い所に手は届きません(汎用性を重視している為、最大公約数的な事しか出来ません)
で、時代は MS-DOS から更に Windows へと進む訳ですが、ここで話は一変してしまいます。そう、GUIの登場です(unix にもGUIはあるのですが、ここでは割愛)
GUIの登場により、コンソールが使われなくなり、その変わりにウィンドゥ、マウスなど、グラフィカルな部分を扱う関数や、プロセス制御を行ったり、イベントを処理する必要が出て来ました。
その為、今までのシステムコール関数と標準ライブラリ関数は忘れ去られ、変わりにAPI関数が登場しました。
C言語そのものも、GUIを扱いやすくする為、クラスの概念を導入し、クラスの階層化を行ってC++に進化して来ました。
以上、長文になりましたが、回答になっているでしょうか?
No.1
- 回答日時:
システムコールはunixの世界で用いられるものです。
unix以外の環境でもunixシステムコール互換のライブラリが用意されている場合が多いと思いますが、、、
システムコールは、OSの機能を直接さわるものですので、OSによって異なる部分があったりします。標準ライブラリは、環境による差異を吸収し、どんな場合でも同じように使えるように、かつ使いやすいように設計されています。
初心者とのことですので、どうしても必要でなければシステムコールは使わずに、なるべく準ライブラリをお使いになることをおすすめします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- C言語・C++・C# いまc言語の標準ライブラリ文字列を勉強しているのですがいまいちわかりません。 strcmpとmemc 5 2023/07/04 15:34
- 統計学 直線の傾き(回帰係数)から相関係数を計算できるのでしょうか? 2 2022/09/16 19:28
- 統計学 確率統計でExcelの使い方を教えてください。 3 2022/07/27 19:21
- C言語・C++・C# C++の標準入力の書き方 6 2023/02/23 23:53
- Windows 8 win8 "ベータ ワールドワイド言語サポートで Unicode UTF-8 を使用"を出したい 2 2023/05/23 19:57
- その他(AV機器・カメラ) モバイルバッテリー(USB出力)でラジオを動かす方法 7 2022/05/31 11:17
- iPhone(アイフォーン) 仕事でPDFファイルをダウンロード、閲覧するのにiBooksを使っていますが、ライブラリに凄い数のフ 2 2022/11/16 07:08
- 日本語 「どんな」は標準語 4 2022/05/17 14:32
このQ&Aを見た人はこんなQ&Aも見ています
-
餃子を食べるとき、何をつけますか?
みんな大好き餃子。 ふと素朴な疑問ですが、餃子には何をつけて食べますか? 王道は醤油とお酢でしょうか。
-
あなたにとってのゴールデンタイムはいつですか?
一週間の中でもっともテンションが上がる「ゴールデンタイム」はいつですか? その逆で、一週間でもっとも落ち込むタイミングでも構いません。 よかったら教えて下さい!
-
「覚え間違い」を教えてください!
私はかなり長いこと「大団円」ということばを、たくさんの団員が祝ってくれるイメージで「大円団」だと間違えて覚えていました。
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
ギリギリ行けるお一人様のライン
おひとり様需要が増えているというニュースも耳にしますが、 あなたが「ギリギリ一人でも行ける!」という場所や行為を教えてください
-
ページ置き換え LRU方式
情報処理技術者・Microsoft認定資格
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ライブラリ作成時のグローバル...
-
Google ColaboでGUI作成
-
Windows Media Playerを開くと...
-
横スクロールアクションのステ...
-
システムコールと標準ライブラ...
-
ListViewで複数項目のドラッグ...
-
iCloudフォトライブラリ内の画...
-
オブジェクトブラウザの「stdol...
-
unix-c と linux-c の違いは?
-
DirectX Graphics と OpenGLっ...
-
python urlopen error について...
-
設定ファイルを扱うライブラリ...
-
LIBCMT.LIBをリンクしてコンパ...
-
oggファイルを再生したい
-
現在、Ubuntu上で動くGUIアプリ...
-
stricmp
-
マウスのクリックを自動で
-
Dreamweaverのライブラリが反映...
-
お勧めの参考書
-
モバイルCというC言語のプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Google ColaboでGUI作成
-
Windows Media Playerを開くと...
-
iCloudフォトライブラリ内の画...
-
python urlopen error について...
-
本格的なGUIを作るのにおすすめ...
-
三目並べを作っているのですがD...
-
マウスのクリックを自動で
-
unix-c と linux-c の違いは?
-
Ps+のフリープレイでDestiny2の...
-
boostのアンインストールについて
-
(C言語等で)既存ファイル群の属...
-
LIBCMT.LIBをリンクしてコンパ...
-
オンラインゲームを作る道のり...
-
プログラマーで「使えない人」...
-
ライブラリ作成時のグローバル...
-
DirectX Graphics と OpenGLっ...
-
gcc に mktemp 危険と怒られ...
-
モバイルCというC言語のプログ...
-
outp関数について
-
cでなぜguiアプリが作成出来る...
おすすめ情報