ふつうのLinuxプログラミング
Linux超初心者です。自分なりにLinuxについてまとめてみました🐧すべて「ふつうのLinuxプログラミング」を読んで得た知識です。
Linuxの世界とは何なのか
まずLinuxって何?というお話。
ざっくりいえばオペレーティングシステム(OS)のこと。PCにはOSがあらかじめ入っており、WindowsやMac OS、Linuxなどの種類がある。
Linuxは正確に言うとOSのことではなく、カーネルが作り出している世界のこと。OSの核(kernel:カーネル)が由来している。カーネルはハードウェア(CPU, メモリなど)を統括しているもの。
Linuxを描き出す概念
Linuxが何をしてるのか?を分かるには3つの概念を知る必要があります。
・ファイルシステム
lsをして出てくるファイルを成立させている概念
・プロセス
動作中のプログラム・ps axで見れる
・ストリーム
バイトの流れのこと
この概念がそれぞれどう動いているかというと・・・
<ファイルの中身を取り出す例>
プロセスがファイルの内容にアクセスしたいときは、ファイルにつながるストリームを作るようカーネルに(システムコールを使って)頼む。その後、システムコールを使ってファイルの中身を取り出す。
わたしたちが普段意識せずやっているファイル操作も、Linuxが裏でいろいろしてくれているんですね😇
Linuxとユーザー
昔は1人しか使えないPCありましたよね。(懐かしい)現在は母・父・私、など複数人で使うことができ、家族が1つのPCを使うことが出来ます。これを「マルチユーザーシステム」といいます。
マルチユーザーシステムは複数人で使えて便利な反面、ログインや権限など複雑な設定が出てきました。
ここで権限(パーミッション)の話が出てきます。(ls -l して出てくるやつ)
例えば755(本人で読み書き実行の全許可・グループとその他は読む実行を付与)の場合、 -rwx r-x r-x となります。755は8進表記で「r, w, x」ごとにr=4, w=2, x=1, -=0の合計を出しています。(ややこしい〜)
また、ユーザーAのパーミッションを許可したときに、ユーザーAであることを証明するのがクレデンシャルです。クレデンシャルがあることで「プロセスにおいてユーザーの代理人として動作している」という証明になります。
Linuxプログラム
本書ではLinuxでのCプログラミングを解説してくれています。私はC言語を触ったことないのでざっくり読み飛ばしました。
「さあ、grepコマンドを作ってみよう」とか無理です😇grepコマンドは使う側で良いかな・・・。
Linuxディレクトリ構造
Linuxのファイルシステムは階層構造になっています。
UNIXは歴史が長いのでディレクトリツリーはOSごとにまちまちだったらしいですが、現在はFHSという標準規格ができ、ディレクトリごとの使われ方が定められています。
・binディレクトリ
基本コマンドを置く。ディストリビューションが管理するディレクトリなので自分でインストールするコマンドは/usr/local/binに置く
・sbinディレクトリ
管理者用コマンドを置く。
・libディレクトリ
ライブラリを置く。binと同様に自分でインストールするコマンドは/usr/local/libに置く
よくshellの設定ファイル(.zshrcなど)に書く名前だなぁという印象。ディレクトリごとにちゃんと規格が決まっていたんですね👀
プロセスにかかわるAPI
プロセスの一生はforkで開始し、exitで終わります。execとexitコマンドしか自分は使ったことないです・・。
・fork
カーネルはそのプロセスを複製する
・exec
自プロセスを新しいプログラムで上書きするシステムコール
・wait
fork()したプロセスの終了を待つ
・exit
プロセスを終了する
複数のプログラムをつなぐにはパイプを使います。
・pipe
プロセスからプロセスに繋がったストリームのこと
↑この説明意味わからなかった😇動作中のプログラム同士をつなげる仕組みだと思います(ふわっと理解)
インターネットの仕組み
ネットワークは別の話だと思いがちですが、マシン内であろうとネットワーク越しであろうと、わたしたちが相手にするのはストリームにすぎません。
インターネットにおいてファイルシステムでのファイル名に相当するのは、IPアドレスとポート番号です。
・IPアドレス
0~255の数を4ドット(.)で区切って「192.168.1.3」のように表現する
・ポート番号
0~65535の数値で1ホストに複数つなげられる
どのサーバーがどのポート番号で待ち受けているかの情報は、あらかじめ決まっています。(メール送信につかうSMTPは25番など)
これは予約済みポート番号といい下記Wikipediaで一覧が見れます。
最初にネットワークだろうがストリームを相手にするだけ書きましたが、IPの世界にはストリームはなく、パケット(バイト列)のみです。(IPとはインターネットを支える通信の規約・手順のこと)
では、どうやってストリームを出しているかと言うと、IPの上にもう一段別のプロトコルを重ねることでストリームに見えるようにしている。そのためのプロトコルをTCPというそうです。
TCP、あああ聞いたことある😂パケットを使ってストリームっぽい仕組みをマシン上に再現しているんですね。
また、IPにも複数バージョンがありIPv4(32ビット)、IPv6(128ビット)についても触れられていました。今までアドレス空間が枯渇していたところIPv6が登場したんですね。
全体的な感想
初心者向きの本で、「カーネル, ストリーム」など聞いたことがあるけど、それらがどう繋がっているか分からない・概念を知りたいという人におすすめです。
C言語を触ったことがある人は、より理解が深まりそう。C言語が分からなくてもざっくりLinuxってなんだろうを知りたいだけなら十分な内容だと思います。
個人的には、本書を読んだから〇〇に役立ったという実感はないのですが、エンジニア間でよく会話にでる用語がざっくり分かったので満足🙂
スキ頂けると嬉しいです〜