selmertsxの素振り日記

ひたすら日々の素振り内容を書き続けるだけの日記

ふつうのLinuxプログラミング読書 (3章)

ファイルとは

  • 何らかのデータを保持し
    • 何らかのデータとは、テキスト、画像、
  • パーミッションや更新時間などの付帯情報を保持しており
  • 名前で指定して閲覧・実行ができるものである

ファイルの種類

  • Regular File
    • 画像。動画。テキストなど。
  • Directory
    • このファイルの中に、入っているファイル一覧
  • Symbolic Link
    • このファイルが指し示す一つのファイル
  • Device File
    • バイスをファイルとして表現したもの
    • マウス、キーボード、モデム、HDD、SSDなどが含まれる

シンボリックリンクとハードリンク

本には書かれていないので、自分で確認したことを記載。

$ echo 'hogehoge' > ln.txt
$ ln -s ln.txt ln_soft.txt
$ ln ln.txt ln_hard.txt
$ ls -li
total 32
56944157 -rw-r--r--  2 shuhei_morioka  admin   9  2  5 20:49 ln.txt
56944157 -rw-r--r--  2 shuhei_morioka  admin   9  2  5 20:49 ln_hard.txt
56944166 lrwxr-xr-x  1 shuhei_morioka  admin   6  2  5 20:49 ln_soft.txt -> ln.txt

このような形でハードリンクとソフトリンクを使って、ファイルを生成しました。

$ cat ln_soft.txt
hogehoge
$ cat ln_soft.txt
cat: ln_soft.txt: No such file or directory
$ cat ln_hard.txt
hogehoge

ソフトリンクは参照しているファイルを削除してしまうと、何のファイルにもアクセスできなくなってしまいます。しかし、ハードリンクでは直接アクセスするためのi-nodeをリンク元のファイルと共有しているため、リンク元のファイルが削除されてもアクセスすることが出来ます。

ソフトリンクでは、リンク先のパスのみを保持しているため、新しいファイルを元のパスに配置すると読み込んでくれるようになります。

$ readlink ln_soft.txt
ln.txt
$ echo 'fugafuga' > ln.txt
$ cat ln_soft.txt
fugafuga

このようにソフトリンクの方が、プログラムから扱いやすそうに見えます。

Linux: ハードリンクと inode - Qiita シンボリックリンクとハードリンクの違い - Qiita

ファイルシステム

物理的なディスクをパーティションとして区切り、その上にファイルシステムをマウントさせることで、ファイルを扱う土台となるディレクトリツリーが出来上がります。以下、macosamazon linuxファイルシステムが違うよということの確認していきます。

# macosで実行した結果
➜  ~ mount
/dev/disk1 on / (hfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)
# amazon linuxで実行した結果
ec2-user@bastion ~
$ mount -t ext4
/dev/xvda1 on / type ext4 (rw,noatime,data=ordered)

プロセスとは

動作中のプログラムのこと。helloというプログラムを動かすと、helloプロセスが生成される。 プログラムとプロセスは1対多の関係であり、プロセスのユニーク性の識別するには Process ID を用いる。プロセスへ命令するものは シグナル と呼ばれ、よく使われるものとして Ctrl + c の割り込みシグナルなどがある。

ストリームとは

バイトが流れる通り道。つまり byte streamのこと。本書独自の用語である。 プロセスからファイルにアクセスするとき、プロセスはシステムコールを使って、ファイルやプロセスにアクセスするためのストリームを作る。

ファイルにアクセスができるので、テキストや画像だけでなく、ファイルの一種であるデバイスファイル(キャラクタデバイスであるモデムや、ブロックデバイスである HDD/SSDなど)にもアクセスすることができる。

プロセスとプロセスの間でストリームを通じて行われるデータのやりとりをプロセス間通信と呼ぶ。プロセス間通信の中には、下記の2つのやりとりが存在する。

  • パイプ
    • ストリームの向き先に別のプロセスを用意すること
  • ネットワーク通信
    • ストリームを別のコンピューターまで伸ばすこと

まとめ

  • 画像・テキストが格納されていたり、プログラムが記載されていたりする ファイル
  • プログラムを実際に実行している プロセス
  • プロセスが実行した結果をディスプレイ、ファイルなどに出力するためのデータの流れを作り出す ストリーム

この3点がLinux世界を構築する上で重要な概念である。