🐧

ふつうのLinuxプログラミング第2版【1-2章】

4 min read

どうも軟水(@omizu_in_da_ie)です。

https://www.amazon.co.jp/dp/B075ST51Y5/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

社内の新卒OJTで当書を使用しており、自分の勉強記録用として書き残そうと思いたったので、重鈍な筆を持ち上げました。
勉強用なので、まさかり投げは大歓迎です。ぜひコメント欄で投げまくってください。

1−4章は概念的説明が多いので今回は2分割で書きますが、それ以降はコードも出てくるので1章ずつ書く予定です。

第1章 Linuxプログラミングを始めよう。

概要

Linuxを構成する3つの概念

  • ファイルシステム
  • プロセス
  • ストリーム
    上記3つを理解し、「Linux世界が何によってできているか」 を教えることがこの本の目的。

本の構成

この本は以下の3つの部に区切られている。

  1. Linuxの仕組み(1-4章)
  2. Linuxプログラミングの根幹(5-14章)
  3. Linuxネットワークプログラミング(15-16章)

前提知識

  • C言語の入門は済んでいる(構造体とポインタくらいは分かる)
  • Linuxでエディタが使える
  • Linuxの基本コマンドを知っている(cat, ls, cd等)

1つ目で完全に震え上がってしまいましたが、とにかく進めます。

対象読者

  • C言語入門以降にLinuxプログラミング勉強したい人
  • LinuxやUNIXの本読んでみたけど難しくて理解できなかった人

対象のディストリビューション

ディストリビューションって?

  • Linuxとその他のソフトウェアが一緒になったもの
  • Linuxはオープンソースなのでいろんな種類あるよ

引用元
CentOSのロゴってLONGMANのTOEFL参考書に似てる気がする

本書推奨ディストリビューション

  • Ubunts 16.04
    • コミュニティ手動のものの中で最大規模のもの
  • CentOS 7
    • 業務用Linuxの中でデファクトスタンダードであるRed Hatの無償版

推奨以外のものでも全然可能。同期はGCPのCloud Shell(Debian)でやってる人も多かったです。

gccの細かいとこメモ

本書ではコンパイラとしてgccを使う。

oオプション

$ gcc -o hoge hoge.c
  • 最適化を行うオプション
    • プログラミングの世界における単なる「最適化」とは 「実行速度を速くする」 こと
    • その他の文脈の最適化は明示的に補足される
      • ex)「プログラムサイズを最適化する」
    • 最適化のゆるい順にO1(O) < O2 < O3
      • 基本的にはO2でやれば無難

Wallオプション

$ gcc -Wall
  • バグを防止するための最も手軽な手段
  • これをつけると一般的な警告オプションがつく
  • ANSI Cスタイルの宣言と定義を使わないと完全なチェックが行われない
  • 細かいwarningまで表示してくれる -Wオプションもあるらしい

これ地味に使ったことないけど、みんな使ってるんですかね?

バグとデバック

バグ:機能の不具合を生むプログラム内の不具合
デバッグ:プログラム内の不具合を修正すること

デバッグの手法

  • printfデバッグ
    • 変数や式を明示的に示し、予想とは異なる値がないか確認する方法
  • デバッガ
    • デバッグを行うための専用のソフトウェアを使用する方法
    • Linuxでは一般的にgdbが使われている(7章で解説)
    • 最近はVS Codeなのかな?

コマンドライン引数

argcとargv

argc :"argument count":引数の個数
argv :"argument vector":コマンドライン引数の実体

コマンドライン引数とは?

  • main関数の引数
  • 実行するときにコマンドラインからコマンドライン引数に値を与える事ができる
    ↓ex)
$ ./args x y z  // この場合はx, y, zがコマンドライン引数
  • argcは常に1以上
  • コマンドライン引数だけを扱いたいときはargv[1]から処理を始める

argscについて

args.c
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
    int i;

    printf("argc=%d\n", argc);
    for (i = 0; i < argc; i++) {
        printf("argv[%d]=%s\n", i, argv[i]);
    }
    exit(0);
}

上記のソースコードを実行してみると、

  • argv[0]:実行したプログラム名が常に入る
  • argv[1,2,3,...]:入力されたコマンドライン引数が表示

第2章 Linuxカーネルの世界

Linuxを構成する三要素

  1. ファイルシステム:ファイルの仕組み
  2. プロセス:動いてるプログラム
  3. ストリーム:データの通り道

オペレーティングシステム(OS)

  • コンピュータの操作を司るソフトウェアのこと
  • WindowsとかMac OSとか
  • 案外厳密な定義はないらしい
  • ソフトウェアパッケージ ⊂ Linux OS
  • Linuxに含まれるパッケージ
    • シェル(bashとか)
    • util-linux(initとか)
    • 基本ライブラリ
    • 開発環境(gccとか)
  • 普段見るLinux:Ubuntu, CentOS,etc... ≠ OS
    • = Linuxディストリビューション

Linuxの世界 = カーネルが作り出す世界

カーネル

  • カーネル(kernel) = システムのドン、偉いやつ
    • 役割:全てのハードウェアとソフトウェアの管理
  • LinuxとはOSのことを意味するが、厳密にはカーネルのことを指している
  • 今後本書では「Linuxカーネル」「Linux OS」を明示的に分けていく

デバイスドライバ

  • ハードウェア(HDD,SSD,CPU,メモリ等)の統括には、統括するための部品(デバイスドライバ)を独立させておく必要がある。
    • ハードウェアには多くの種類が存在し、それぞれ操作方法も異なるため

システムコール

  • カーネルに仕事してもらうためにシステムコールを使う
  • Linuxでハードウェアを操作できるのはカーネルのみ
    • つまりハードウェアを操作するたびに他のシステムにこき使われている
  • システムコールの例:open, read, write, stat, unlink,etc...
  • 本書ではシステムコールを通してストリームとプロセスを学んでいく

ライブラリとライブラリ関数

  • ライブラリ関数=ライブラリ(library)に収められた関数
    • printf(),exit(),strlen(),etc...

図書館で例えると...

こんな感じ

  • ライブラリ関数を使うにはリンクという作業が必要
    • 11章で解説

ここでシステムコールとライブラリ関数の違いとはなんぞや?という疑問が出るかもしれない。
簡単に説明すると

  • ライブラリ関数:便利だからぜひ使ってね!
  • システムコール:〇〇という操作したいならこれ使うしかない
    • ライブラリ関数:fopen, fread, fgets
    • システムコール:open, read, write
    • これらの操作は同じ

ライブラリ関数を使うメリット

  1. 移植性の向上
  2. バッファリングによる速度向上(バッファリングについては6章で解説)
  3. 簡単かつ短く書ける

libc

標準ライブラリでよく使われるものが「標準Cライブラリ(通称libc)」
lsコマンドでcloud shell内のlibcを探してみると

API

API(Application Programming Interface) とは?

  • OSやアプリケーションが持つ機能の一部を、他のアプリケーションから簡単に利用できるようにするためのインターフェイス(仲立ち)
  • 非常に語義の広い言葉
    • カーネルのAPI = システムコール
    • CライブラリのAPI = 関数

1-2章は以上となります。
次回は3-4章

ではまた!

Discussion

ログインするとコメントできます