tkd2017の勉強ブログ

日々の勉強をアウトプットするブログ

[ふつりな 2版] 第1章 Linuxプログラミングを始めよう

www.high-novice.com

  • P.4〜P.24

1.1 本書の概要

この本の目的をざっと説明。シンプルにいえば Linuxという世界の常識 を知ること。

Linux世界を構成している概念は次の3つ。

  • ファイルシステム
  • プロセス
  • ストリーム

Cプログラミングを初歩から解説しているが、次の3つ程度を前提としています。

  • Cの構造体とポインタくらいは分かる
  • Linuxでエディタが使える
  • cd, ls, cat, lessなどの基本的なLinuxコマンドを知っている

まぁこの辺は大丈夫。ポインタについては、初めて勉強してからかなり経っているけど、今のご時世でもやはり初学者には理解しにくい概念なんだろうか。

エディタはずっとvi(vim)を使っているけど、結局Emacsはほとんど触らずにきてしまったなぁ。

本書では基本的に、ディストリビューションに依存しないようにしているが、パッケージなどが必要な場合はUbuntu 16.04CentOS 7の環境を用いる。

今だったらVirtualBox+Vagrantで簡単に用意できますね。いい時代です。

1.2 プログラミング環境の準備

ここからは実際にコマンドなどを実行していくため実環境が必要。

使用PCはMacなので基本的なコマンドはそのままでも使用できるが、Linux(not UNIX)プログラミングなので、ちゃんとLinuxの環境を用意しよう。

手元のツールのバージョンを確認してみる。

$ vbox-img --version
5.1.28r117968

$ vagrant --version
Vagrant 1.9.0

やや古いバージョンらしい。せっかくなので最新バージョンまで上げてしまおう。

$ vbox-img --version
5.2.2r119230

$ vagrant --version
Vagrant 2.0.1

ついでにコマンド補完のパッケージも追加で入れておくと便利。

$ brew install bash-completion vagrant-completion
$ echo '[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion' >> ~/.bash_profile

作業用のディレクトリを作成してVMを起動する。

$ mkdir ~/Documents/stdlinux2
$ cd ~/Documents/stdlinux2/

$ vagrant init centos/7
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

$ vagrant up

初めて使用するboxの場合はダウンロードが行われるため結構待たされる。その間に1.61.7を読んでしまおう。

1.6はC言語の規格の話し。K&R C、ANSI C(C89)、C99、C11などいろいろある。本書ではC99をベースとしている。

1.7manコマンドの話し。特にセクションについての知識はここで押さえておきたい。本書では例としてprintfが挙げられている。printf(1)だったらLinuxの printfコマンド を指すし、printf(3)だったらライブラリの printf関数 を指す。

VMの起動が成功したら、SSHで接続してLinux環境で作業ができます。

$ vagrant ssh
[vagrant@localhost ~]$

gccがないと話しが進まないためさくっとインストールします。

[vagrant@localhost ~]$ gcc -dumpversion
-bash: gcc: command not found
[vagrant@localhost ~]$ sudo yum group install -y "Development Tools"
[vagrant@localhost ~]$ gcc -dumpversion
4.8.5
[vagrant@localhost ~]$ yum install -y vim

書籍ではsudo yum group install -y "Developer Tools"とコマンドが紹介されていましたが、グループ名が間違っているのかCentOSのバージョン違いかで動きませんでした。

1.3 gccを使ったビルド(1)

次のようなプログラムを書いてコンパイル・実行します。

hello.c

#include <stdio.h>

int
main(int argc, char *argv[])
{
    printf("Hello, World!\n");
    return 0;
}

実際には次のような流れでディレクトリの作成からプログラムの実行までを行います。

[vagrant@localhost ~]$ mkdir hello && cd $_
[vagrant@localhost hello]$ vim hello.c
[vagrant@localhost hello]$ gcc hello.c
[vagrant@localhost hello]$ ./a.out
Hello, World!

1.4 gccを使ったビルド(2)

gccのオプションの話し。

  • -o: コンパイルして生成するバイナリファイルの名前を指定できる(指定しないとa.out
  • -Wall: コンパイラの一般的な警告オプションがすべてオンになる
  • -O1, -O2, -O3: 最適化オプション。-O3が一番強力な最適化を行うがコンパイラのバグを引き当てやすいらしく-O2を推奨している

printfデバッグとgdbデバッガの話題にも少し触れている。

1.5 コマンドライン引数

Cでは、コマンドライン引数はmain関数の引数に渡されるよ、という話し。

次のようなプログラムを書いてコンパイル・実行します。

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);
}

コンパイルして動作確認します。

[vagrant@localhost hello]$ vim args.c 
[vagrant@localhost hello]$ ls
a.out  args.c  hello.c
[vagrant@localhost hello]$ gcc -o args args.c 
[vagrant@localhost hello]$ ./args 
argc=1
argv[0]=./args
[vagrant@localhost hello]$ ./args x
argc=2
argv[0]=./args
argv[1]=x
[vagrant@localhost hello]$ ./args x y
argc=3
argv[0]=./args
argv[1]=x
argv[2]=y
[vagrant@localhost hello]$ ./args x y z
argc=4
argv[0]=./args
argv[1]=x
argv[2]=y
argv[3]=z
[vagrant@localhost hello]$ ./args "x y z" 
argc=2
argv[0]=./args
argv[1]=x y z
[vagrant@localhost hello]$ ./args *.c    
argc=3
argv[0]=./args
argv[1]=args.c
argv[2]=hello.c
[vagrant@localhost hello]$ ./args "*.c"
argc=2
argv[0]=./args
argv[1]=*.c

Linuxのワイルドカードはシェルが展開しているというのがポイントですね。

そのため、展開された結果がプログラムに渡されることになります。

今日はここまで。