見出し画像

ふつうのLinuxプログラミング

Linux超初心者です。自分なりにLinuxについてまとめてみました🐧すべて「ふつうのLinuxプログラミング」を読んで得た知識です。

Linuxの世界とは何なのか

まずLinuxって何?というお話。

ざっくりいえばオペレーティングシステム(OS)のこと。PCにはOSがあらかじめ入っており、WindowsやMac OS、Linuxなどの種類がある。

Linuxは正確に言うとOSのことではなく、カーネルが作り出している世界のこと。OSの核(kernel:カーネル)が由来している。カーネルはハードウェア(CPU, メモリなど)を統括しているもの。

Linuxを描き出す概念

Linuxが何をしてるのか?を分かるには3つの概念を知る必要があります。

・ファイルシステム
lsをして出てくるファイルを成立させている概念
・プロセス
動作中のプログラム・ps axで見れる
・ストリーム
バイトの流れのこと

この概念がそれぞれどう動いているかというと・・・

<ファイルの中身を取り出す例>
プロセスがファイルの内容にアクセスしたいときは、ファイルにつながるストリームを作るようカーネルに(システムコールを使って)頼む。その後、システムコールを使ってファイルの中身を取り出す。

スクリーンショット 2020-04-05 19.13.27

わたしたちが普段意識せずやっているファイル操作も、Linuxが裏でいろいろしてくれているんですね😇

Linuxとユーザー

昔は1人しか使えないPCありましたよね。(懐かしい)現在は母・父・私、など複数人で使うことができ、家族が1つのPCを使うことが出来ます。これを「マルチユーザーシステム」といいます。

マルチユーザーシステムは複数人で使えて便利な反面、ログインや権限など複雑な設定が出てきました。

ここで権限(パーミッション)の話が出てきます。(ls -l して出てくるやつ)

スクリーンショット 2020-04-05 21.26.03

例えば755(本人で読み書き実行の全許可・グループとその他は読む実行を付与)の場合、 -rwx r-x r-x となります。755は8進表記で「r, w, x」ごとにr=4, w=2, x=1, -=0の合計を出しています。(ややこしい〜)

スクリーンショット 2020-04-05 19.28.46

また、ユーザー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
プロセスからプロセスに繋がったストリームのこと

↑この説明意味わからなかった😇動作中のプログラム同士をつなげる仕組みだと思います(ふわっと理解)

インターネットの仕組み

ネットワークは別の話だと思いがちですが、マシン内であろうとネットワーク越しであろうと、わたしたちが相手にするのはストリームにすぎません。

スクリーンショット 2020-04-05 21.08.24

インターネットにおいてファイルシステムでのファイル名に相当するのは、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ってなんだろうを知りたいだけなら十分な内容だと思います。

個人的には、本書を読んだから〇〇に役立ったという実感はないのですが、エンジニア間でよく会話にでる用語がざっくり分かったので満足🙂


スキ頂けると嬉しいです〜