ラズパイでgccを使ってコマンドをつくる

botman_green Pythonとかラズパイ

Raspbian-10

はじめに

私は Linux も C 言語もほぼ知らないですが今この本を読んで勉強中です。

ふつうのLinuxプログラミング 第2版 Linuxの仕組みから学べるgccプログラミングの王道

新品価格
¥2,722から
(2021/3/29 21:10時点)

ざっくり言うと cat, ls コマンドとかを自作して Linux プログラミングについて学ぼう!っていう本です(まだ途中までしか読んでない)。
この本を読んでて、標準入出力とオプション解析でわりとコマンドで遊べるんじゃないかなと思ったので以前 Qiita でトレンド入りしてたこちらを作ってみたいと思います。

カフェでプログラミングしてる風(でも何もやってない)Java(クソ)コード

ラズパイを使うのは Raspbian に gcc が入ってるのと Raspbian も Linux だから!

gccの使い方

gcc は C のコンパイラです。
とりあえず Hello, World! をやってみます。

  1. 上記を hello.c で保存する。
  2. 下記コマンドでビルドする。
  3. 下記コマンドで実行する。

-Wall オプションはコードチェックをしてくれるやつなのでとりあえず常に付けとけば OK(この変数使ってないよ!とか警告してくれる)。
-o オプションはプログラムに名前を付けるために使う。付けない場合は常に a.out で作成される。

コマンドライン引数

上記の argc は引数の数、argv は引数の実体です。
argv[0] には毎回プログラム名が入ってる(上記の hello の場合、./hello になる)。

参考

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

標準入出力

すべてのプロセス(動作中のプログラム)に用意されているストリーム(バイト列の通り道)は下記3つ。

  • 標準入力
    キーボード、別プロセスとかにつながってる。
  • 標準出力
    ディスプレイ、別プロセスとかにつながってる。
  • 標準エラー出力
    標準出力は別プロセスにつながってることがあるので別枠の出力。

すべてのストリームにはファイルディスクリプタという整数値が割り当てられていてプログラムからストリームを扱う場合はこのファイルディスクリプタを利用する。

標準入出力には標準入出力ライブラリ(stdio:standard I/O)を使う模様。

使い方

下記のようにするとパラメータで受けたファイルの中身を出力する。

参考

  • 第5章ストリームにかかわるシステムコール
  • 第6章ストリームにかかわるライブラリ関数

オプション解析

コマンドのオプションにはショートプションとロングオプションのパラメータあり、なしがある。

以下は ls -a -s -k と同じ。
・ls -ask
・ls --all --size --kibibytes
以下は head -n 5 と同じ。
・head -n5
・head --line 5
・head --line=5

マイナス始まりは単なる慣習だけど新しいコマンドはだいたい慣習に従っているらしい。

オプション解析には getopt_long を使う。定義は下記。

使い方

ソースはコマンドラインオプションの処理を参考にしました。

上記を実行するとこうなる。

参考

  • 第7章 head コマンドを作る

プログラミングしてる風(でも何もやってない)コマンドをつくる

本命のコマンドをつくっていきます。ソースは下記。

回数指定(n)と#表示タイミングをランダムにする(r)オプションをつけてみました。

こんな感じです。

work

おわりに

もうちょっとスリープタイミングを調整すればもっとそれっぽくなりそうですがとりあえず動くやつはできました。

「第10章ファイルシステムにかかわる API」まで読んだので、現段階でもわりとコマンドで遊べそうです。

コメント

  1. […] 必要そうな知識のざっくりまとめです。 gcc やオプションに関しては前回の記事をどうぞ。 […]

タイトルとURLをコピーしました