• ベストアンサー

S_IFREG

C言語を勉強し始めた初心者です。 質問タイトルにある通り、S_IFREGをググってみると stat関数で 以下フラグが st_mode フィールド用に定義されているようなのですが 「S_IFREG 通常のファイル」のような検索結果が返ってきます。 ここでいうこの通常ファイルとは、どのようなファイルを表すのでしょうか?通常という意味がよくわかりません。

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

  • ベストアンサー
  • noocyte
  • ベストアンサー率58% (171/291)
回答No.2

>「S_IFREG 通常のファイル」のような検索結果が返ってきます。 その検索結果の前後に,S_IFREG 以外の S_IFxxxx がありますよね? それら S_IFxxxx 以外のものが通常ファイルということになります. 例えば, http://www.linux.or.jp/JM/html/LDP_man-pages/man2/stat.2.html には次のように書かれています. > 以下のフラグが st_mode フィールド用に定義されている: > (中略) > S_IFSOCK 0140000 ソケット > S_IFLNK 0120000 シンボリック・リンク > S_IFREG 0100000 通常のファイル > S_IFBLK 0060000 ブロック・デバイス > S_IFDIR 0040000 ディレクトリ > S_IFCHR 0020000 キャラクター・デバイス > S_IFIFO 0010000 FIFO だから,ソケットでもなく,シンボリック・リンクでもなく, (中略) FIFO でもないものが「通常のファイル」ということになります. … とまあ,まわりくどい書き方をしましたが, 要するに,誰もがフツーに「ファイル」と読んでいるもののことですよ. テキストファイル,実行ファイル,データファイル,バイナリファイル,…. ユーザやアプリケーションから見ると,これらは役割も目的も違うものですが, ファイルシステムの立場から見ると,これらの間に違いはなく, どれもデータ (バイト列) を格納する容れ物という点で違いはありません. だからこれらをひとまとめにして「通常ファイル」として扱うわけです. これに対し,ファイルシステムは,例えば「通常のファイル」と 「ディレクトリ」を厳格に区別しなければなりません. ディレクトリにはファイルや他のディレクトリを入れることができますが, ファイルに他のファイルやディレクトリを入れることはできないからです. また,アプリケーションがファイルに何を書き込もうが,ファイルシステムは 一切お構いなしですが,ディレクトリに勝手なデータを書き込まれては ファイルシステムが大混乱に陥ります. このように,S_IFxxxx は,「ファイルシステムの立場から見た」 分類を示すものです. ところで,そもそもなぜ "S_IFREG" を検索したのでしょうか? 手元の開発環境で stat() を使おうとしてそのマニュアルを調べ, 「S_IFREG = 通常のファイル」と書かれてあったが「通常のファイル」 が何を指すのかわからないから検索した,というのならわかります. しかし質問の文面を見ると,"S_IFREG" を検索した結果,stat() の st_mode で使用されることと,「通常ファイル」を意味するという ことがわかった,という逆の順序になっているように読めます. だとすれば,"S_IFREG" で検索したのはどういう動機からなんでしょうか? そもそも何をしたかったんでしょうか? (それとも単に質問文の書き方がまずいだけ?)

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/stat.2.html
PGbeginner
質問者

お礼

丁寧にわかりやすく書いていただきありがとうございます。 >(それとも単に質問文の書き方がまずいだけ?) 私の質問の仕方がまずかったみたいです。 ご迷惑をおかけして、すいませんでした。

その他の回答 (1)

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

データを保管するために使うファイルを「通常の」ファイルといいます。 statは関数ではなく、もともとはUNIXのシステムコールです。UNIXでは、他のOSでいうファイル以外のものもファイルとして見えるように作られていますのでそうなっています。詳しくは「デバイスファイル」とか「スペシャルファイル」をキーワードに検索してみればわかります。

PGbeginner
質問者

お礼

回答ありがとうございます。 参考にさせていただきます。

関連するQ&A