1.OS動作概要(起動時)
|
OSにはカーネルと言うOSの基本機能を担うプログラムが最初に読み込まれる。
このプログラムはコンピュータの資源管理やアプリケーションの実行、プロセス管理を行う。(概略※カーネルの役目:資源やプロセス管理を参照)
カーネルが読み込まれあと、シェルやデーモン(Windowsではサービスと言っている)が読み込まれる。
シェルはユーザーからの操作を受け付ける窓口として実行される。(※シェル、デーモン、コマンド、アプリケーションとは参照)
超概略でOSの動きを記載したが、この中でプログラミングはどの位置にいるかですが、プログラム方法としてシェルコマンド~C言語やPHP,Perl,Pythpn等のスクリプトに分けて簡単に紹介する。
|
(1)カーネルの役目:資源やプロセス管理
|
Linux系のプログラム(表計算表プログラムなどのアプリケーション)では複数のプログラムを動作させる事が出来この様なプログラムをプロセスと言います。
また必要なメモリ(ハードディスク、ファイルシステムなども含む)、CPUを含むハードウェア(キーボードやマウスその他I/Oインターフェース(ネットワーク))などを資源と言います。
複数のプロセスが動作しているために各プロセスが一つの資源を奪いあい同時に使用することによる不具合を無くするために資源の各プロセスの開始、停止、メモリーなどは領域の分配を時間的、重要度的な割込みなども使用して管理する事をカーネルが行っており、これをカーネルで資源およびプロセス管理を行っていると言っている。
|
|
OSの中心部分カーネールなどに命令を伝えてくれるプログラムの一種でLinuxの標準シェルは bash だ。(概略は※bashの機能を参照)
コンソール、ターミナルやネットワークごしにリモートからアクセスした場合でも応答しカーネルを通して実行結果を得る橋渡しするのがシェルだ。
|
|
他のプロセスが必要とする機能が有るものでシステムのバックグラウンドで常に実行されるプロセスとしてシステムの開始時に開始され、システムが停止するまで実行される。
デーモン化のメリットとしては高速に反応することができるためリアルタイムに反応が必要なプログラムの多くはデーモン化されている。デーモンプログラムの一例としてはhttp (Webサーバ) が有る。
|
|
主に C 言語などで書かれたコンパイルされたプログラムで、/bin などのディレクトリ内に置かれています。
シェルは入力されたコマンドと同じ名前のプログラムを、/bin などのディレクトリ内から探し出し起動する。
|
(5)アプリケーションとは
|
GUI 環境を持っているか、あるいはコンソール(コマンドウィンドウ)で動作させる仕様なのか、などによって動作が異なります。
|
CLI Command Line Interface コマンドラインのインターフェース
GUI Graphical User Interface グラフィカルなインターフェース
(6)bashの機能
|
①ジョブ管理機能 (プログラムのフォア又はバックグラウンド処理切替機能 fg/bg)
②コマンドの実行/停止/再開 (Ctrl+C,Ctrl+Z)
③シェルスクリプトの実行
④四則演算
⑤ホームディレクトリ(~)の定義やエイリアス機能(alias)
などが有る。
③のスクリプトとはシェルプログラムで使用するコマンドなどを記述したテキストファイルだ。
シェル上何行ものタスクを記載していた物をこのテキストファイルに記載することにより一度に実行が可能となる。
|
(7)環境変数について
|
一つにPATHという変数があり、ここで設定したディレクトリ下にあるファイル名(コマンドなど)を呼び出すときには通常ファイルの前に記載するディレクトリー名を省略できる。
これは、シェルがこのPATHに書かれたディレクトリを順に辿って指定されたコマンドを検索するためだ。
|
2.各プログラミング
(1)シェルコマンド
|
OSのインストールでも使用したシェルコマンドです。
このコマンドをテキストファイルに書込んで多くの処理を行う事もできます。
この一連の処理をPHPやPerlから実行することも出来ます。
コマンドは非常に多く概略以下のものが有ります
|
|
a.ファイル操作コマンド
S欄の〇はシェルプログラムの内部コマンド
| コマンド |
S |
説 明 |
使 用 例 |
| ls |
〇 |
ディレクトリの内容を一覧表示 |
ls [ディレクトリ] |
| cd |
〇 |
ディレクトリの移動 |
cd [ディレクトリ] |
| pwd |
〇 |
カレントディレクトリのパスを表示 |
pwd |
| alias |
〇 |
シェルに「外部コマンドの別名」を定義する |
|
| export |
〇 |
環境変数を設定する |
|
| fg |
〇 |
バックグラウンドで処理しているプロセスをシェルのメイン処理としてフォアグランド処理に切り替える |
|
| bg |
〇 |
フォアグランドで処理しているプロセスをシェルのサブ処理としてバックグランド処理に切り替える |
|
| exec |
〇 |
execコマンドで指定した外部コマンドにプロセスIDをそのまま引き継がせる。 |
|
| mkdir |
|
新しいディレクトリを作成 |
mkdir [ディレクトリ] |
| rmdir |
|
空のディレクトリを削除 |
rmdir [ディレクトリ] |
| ln |
|
ハードリンクまたはシンボリックリンクを作成 |
ln ターゲット リンク名 |
| cp |
|
ファイルをコピー |
cp コピー元 コピー先 |
| mv |
|
ファイルを移動または名前を変更 |
mv 移動元 移動先 |
| rm |
|
ファイルを削除 |
rm ファイル |
| touch |
|
空のファイルを作成またはタイムスタンプを変更 |
touch [ファイル] |
| chmod |
|
ファイルのアクセス許可を変更 |
chmod アクセス許可 [ファイル] |
| chown |
|
ファイルの所有者を変更 |
chown 所有者[:グループ] [ファイル] |
| chgrp |
|
ファイルのグループを変更 |
chgrp グループ [ファイル] |
| find |
|
ファイルを検索 |
find [検索ディレクトリ] [条件] |
| locate |
|
インデックスを使用してファイルを高速検索 |
locate [ファイル名] |
| du |
|
ディスク使用量を表示 |
du [ディレクトリ] |
| df |
|
ファイルシステムのディスク使用量を表示 |
df |
| cat |
|
ファイルの内容を表示 |
cat [ファイル] |
| more/less |
|
ファイルの内容をページ単位で表示 |
more [ファイル]/less [ファイル] |
| head |
|
ファイルの先頭部分を表示 |
head [ファイル] |
| tail |
|
ファイルの末尾部分を表示 |
tail [ファイル] |
bテキスト操作コマンド
| コマンド |
説明 |
使用例 |
| grep |
テキストを検索 |
grep パターン [ファイル] |
| awk |
テキストを処理 |
awk 'プログラム' [ファイル] |
| sed |
ストリームエディタ(テキストの置換など) |
sed 'スクリプト' [ファイル] |
| cut |
テキストを分割 |
cut [ファイル] |
| paste |
テキストを結合 |
paste [ファイル1] [ファイル2] |
| sort |
テキストを並べ替え |
sort [ファイル] |
| tr |
文字の置換・削除 |
tr 文字セット1 文字セット2 |
| uniq |
重複行を削除 |
uniq [ファイル] |
| wc |
行数、単語数、バイト数をカウント |
wc [ファイル] |
c.システム操作コマンド
| コマンド |
説明 |
使用例 |
| sudo |
一般ユーザーがroot(特権ユーザーの)権限でプログラムを実行する |
sudo |
| ps |
現在のプロセスを表示 |
ps |
| top/htop |
リアルタイムでプロセス情報を表示 |
top?/?htop |
| kill |
プロセスを終了 |
kill [プロセスID] |
| killall |
プロセス名でプロセスを終了 |
killall [プロセス名] |
| uptime |
システムの稼働時間を表示 |
uptime |
| uname |
システム情報を表示 |
uname |
| free |
メモリ使用量を表示 |
free |
| iostat |
I/O統計情報を表示 |
iostat |
| vmstat |
仮想メモリの統計情報を表示 |
vmstat |
| lsof |
開いているファイルの一覧を表示 |
lsof |
| dmesg |
カーネルのメッセージを表示 |
dmesg |
| service |
サービスを管理 |
`service サービス名 [start] |
| systemctl |
systemdサービスを管理 |
`systemctl サービス名 [start] |
| at |
指定した時刻にコマンドを実行 |
at [時刻] |
| crontab |
crontab -e |
|
| alias/unalias |
コマンドのエイリアスを設定/削除 |
alias エイリアス='コマンド'/unalias [エイリアス] |
| history |
コマンド履歴を表示 |
history |
| nohup |
コマンドを終了してもバックグラウンドで実行し続ける |
nohup コマンド & |
| man |
マニュアルページを表示 |
man [コマンド] |
| echo |
メッセージを表示 |
echo メッセージ |
| date |
日付と時刻を表示・設定 |
date |
| cal |
カレンダーを表示 |
cal |
| eeprog |
I2C シリアル バスに接続された 24Cxx EEPROM の読み取りと書き込みを行います。(i2c-toolsコマンド)
※このコマンドを実行しても「コマンドが見つかりません」とメッセージされます。 |
eeprog |
★i2c-tools コマンド
|
| コマンド |
説明 |
使用例 |
| i2cdetect |
I2Cに接続されている機器を検出しID番号を表示する。 |
i2cdetect |
| i2cdump |
I2Cに接続されているレジスタを調べます。 |
i2cdump |
| i2cget |
I2C/SMBus チップ レジスタから読み取ります。 |
i2cget |
| i2cset |
I2Cレジスタを設定します。 |
i2cset |
| i2ctransfer |
1 回の転送でユーザー定義の I2C メッセージを送信します。 |
i2ctransfer |
|
d.ネットワーク操作コマンド
| コマンド |
説明 |
使用例 |
| ping |
ネットワーク接続を確認 |
ping [ホスト名またはIPアドレス] |
| traceroute |
パケットの経路を追跡 |
traceroute [ホスト名またはIPアドレス] |
| ifconfig/ip |
ネットワークインターフェースの設定を表示・管理 |
ifconfig [インターフェース]/ip [コマンド] |
| netstat/ss |
ネットワーク接続、ルーティングテーブルなどを表示 |
netstat/ss |
| scp |
セキュアコピー |
scp コピー元 コピー先 |
| rsync |
リモートおよびローカル間でファイルを同期 |
rsync コピー元 コピー先 |
| wget |
ファイルをダウンロード |
wget URL |
| curl |
データを転送 |
curl URL |
e.圧縮・アーカイブコマンド
| マンド |
説明 |
使用例 |
| tar |
アーカイブを作成・展開 |
tar [コマンド] アーカイブファイル |
| gzip |
ファイルを圧縮 |
gzip [ファイル] |
| gunzip |
ファイルを展開 |
gunzip [ファイル] |
| zip |
ファイルを圧縮 |
zip アーカイブファイル |
| unzip |
ファイルを展開 |
unzip [ファイル] ファイル |
f.ユーザー管理コマンド
| コマンド |
説明 |
使用例 |
| passwd |
パスワードを変更 |
passwd [ユーザー名] |
| useradd |
ユーザーを追加 |
useradd [ユーザー名] |
| userdel |
ユーザーを削除 |
userdel [ユーザー名] |
| usermod |
ユーザー情報を変更 |
usermod [ユーザー名] |
| groupadd |
グループを追加 |
groupadd [グループ名] |
| groupdel |
グループを削除 |
groupdel [グループ名] |
| groups |
ユーザーが所属するグループを表示 |
groups [ユーザー名] |
| who/w |
ログインしているユーザーを表示 |
who/w |
|
(2) Cプログラミング
|
Cプログラムミングにはホストとフリースタンディング環境の2つの環境により作成される。
フリースタンディング環境ではpeintfやwriteなどの関数は無く、入力(キーボードなど)や出力(CRTなど)はアセンブリで書きそれをCからシステムコール呼び出しをして作って行くため、カーネルも作成出来るが、ハードウエアの事も理解してプログラムを作成しなければならないため、多くの時間が必要となり、通常のプログラミングでは使用しない。
ホスト環境では printf 関数などOS(カーネル)上で動作することを前提としたライブラリ関数を使用したプログラミングで通常がこの環境を使用して開発する。
この事から、ホスト環境で開発することを前提として説明する。
printf は標準ライブラリ※標準ライブラリ参照 のstdio.hの一部関数で、このライブラリを使用してプログラミングをする場合はプログラムを記述する先頭行に
#include <stdio.h>
と記載して使用する事をプログラム環境に知らせる。
このライブラリを使用してプログラムを作成することになる。 |
※標準ライブラリ
|
C言語の標準規格で定められている。
JIS X3010:2003(ISO/IEC 9899:1999)、通称C99では、標準ヘッダとして以下の24ファイルを定めている。
| ヘッダ |
名 称 |
内 容 |
| assert.h |
診断機能 |
実行時診断を行うassertマクロを定義する。 |
| complex.h |
複素数計算 |
複素数計算をサポートするマクロ、関数を宣言、定義する。C99より追加。 |
| ctype.h |
文字操作 |
文字分類、文字変換に有用な関数を宣言する。 |
| errno.h |
エラー |
ライブラリ関数内エラーの報告用マクロを定義する。 |
| fenv.h |
浮動小数点環境 |
浮動小数点環境へのアクセス手段を提供するための型、マクロ、関数を宣言、定義する。C99より追加。 |
| float.h |
浮動小数点型の特性 |
浮動小数点型の大きさや特性を表すマクロを定義する。 |
| inttypes.h |
整数型の書式変換 |
最大幅の整数を操作する関数、及び数値文字列を最大幅の整数に変換する関数を宣言する。C99より追加。 |
| iso646.h |
代替つづり |
演算子の代替つづりマクロを定義する。C95より追加。 |
| limits.h |
整数型の大きさ |
整数型の大きさを表すマクロを定義する。 |
| locale.h |
文化圏固有操作 |
文化圏固有のデータ等の操作を行う型、マクロ、関数を宣言、定義する。 |
| math.h |
数学 |
数学的な演算を行う関数、及び関連するマクロを宣言、定義する。 |
| setjmp.h |
非局所分岐 |
関数の枠組みを越えた分岐を制御するための型、マクロ、関数を宣言、定義する。 |
| signal.h |
シグナル操作 |
種々のシグナルを操作するための型、マクロ、関数を宣言、定義する。 |
| stdarg.h |
可変個数の実引数 |
可変個の実引数を実現するための型、マクロを定義する。 |
| stdbool.h |
論理型及び論理値 |
論理型及び論理値に関連するマクロを定義する。C99より追加。 |
| stddef.h |
共通の定義 |
処理系に依存する型、マクロを定義する。 |
| stdint.h |
整数型 |
指定幅を持つ整数型を宣言する。また、それらの宣言に対応するマクロを定義する。C99より追加。 |
| stdio.h |
入出力 |
入出力に関連する型、マクロ、関数を宣言、定義する。 |
| stdlib.h |
一般ユーティリティ |
一般ユーティリティに関連する型、マクロ、関数を宣言、定義する。 |
| string.h |
文字列操作 |
文字列の操作を行うための型、マクロ、関数を宣言、定義する。 |
| tgmath.h |
型総称数学関数 |
数学関数の型総称マクロを定義する。 |
| time.h |
日付及び時間 |
時間を扱うための型、マクロ、関数を宣言、定義する。 |
| wchar.h |
多バイト文字及びワイド文字拡張ユーティリティ |
多バイト文字、ワイド文字に関連する型、マクロ、関数を宣言、定義する。C95より追加。 |
| wctype.h |
ワイド文字種分類及びワイド文字大文字小文字変換ユーティリティ |
ワイド文字種の分類や大文字小文字変換に有用な型、マクロ、関数を宣言、定義する。C95より追加。 |
|
(3)PHP,Perlスクリプト
|
HTMLの中に書込んでプログラムを実行できる。
またMySQLも制御できる。
Perlでは正規表現を使用できる。
しかしI/Oを制御する場合は直接制御する命令が無く、シェルコマンドのスクリプトやC言語を使用したプログラムを呼出し制御する方法がある。
|
(4)Pythonスクリプト
|
RaspberryPiで推奨している言語
WebサーバーのHTLMの中に書込んだ実行が不明だがその他はライブラリが豊富でプログラムはしやすいと思われる。
勉強する必要がある。 |
3.どんなプログラミング言語を使用するか
|
(1)プログラムしたいデバイス一覧
| [1] |
i2Cを使用したセンサーなど |
| [1-1] |
ADS1115 |
A/D変換器でホール素子を用いた直流電流測定,AC電圧測定 |
| [1-2] |
INA226 |
電圧電流測定 |
| [1-3] |
BME280 |
気温、湿度、大気圧センサー |
| [1-4] |
BH1750 |
照度センサー |
| [1-5] |
DS3231 |
時計 |
| [1-6] |
SSD1306 |
モニター |
| [2] |
I/Oを使用した温度センサーなどを使用したい |
| [2-1] |
DS18B20 |
温度センサー |
| [2-2] |
リレーの制御 |
商用、インバータの電源切替、インバータの電源制御など |
| [2-3] |
RS232C等 |
RS232CやRS485の通信機能を使用 |
| [2-4] |
ModBus |
電力量計や太陽光充電器の情報を取得 |
| [3] |
MySQL |
データサーバーを使用 |
| [4] |
Webサーバー |
HTMLを使用した表示や制御画面の使用 |
| [5] |
メールサーバ |
自動お知らせ |
| [6] |
時計 |
インターネット時計(プログラミングから除外) |
上記センサーや機能を使用するために必要なプログラミングは何を使用したら良いのか?
(2)デバイスと対応するプログラミング言語について
RaspberryPiで推奨しているPythonで全てができそうだ。
今回はこのPythonでプログラムでプログラムをして見よう。
■ライブラリの有無一覧
S=シェル C=C言語 H=PHP l=Perl t=Python 〇はライブラリ有り
| No |
もの |
S |
C |
PH |
Pl |
Pt |
| [1] |
i2c |
〇 |
〇 |
S,C使用 |
S,C使用 |
〇 |
| [1-1] |
ADS1115 |
↑ |
↑ or 〇 |
↑ |
↑ |
↑or 〇 |
| [1-2] |
INA226 |
↑ |
↑ |
↑ |
↑ |
↑ or 〇 |
| [1-3] |
BME280 |
↑ |
↑ |
↑ |
↑ or 〇 |
↑or ? |
| [1-4] |
BH1750 |
↑ |
↑ |
↑ |
↑ |
↑or ? |
| [1-5] |
DS3231 |
↑ |
↑ |
↑ |
↑ |
↑or ? |
| [1-6] |
SSD1306 |
↑ |
↑ |
↑ |
↑ |
↑or ? |
| [2] |
I/O |
〇 |
〇 |
S,C使用 |
S,C使用 |
〇 |
| [2-1] |
DS18B20 |
↑ |
〇 |
↑ |
↑ |
〇 |
| [2-2] |
リレー制御 |
↑ |
〇 |
↑ |
↑ |
↑使用 |
| [2-3] |
RS232C等 |
? |
〇 |
? |
? |
〇 |
| [2-4] |
ModBus |
? |
〇 |
? |
? |
〇 |
| [3-1] |
MySQL |
〇 |
〇 |
〇 |
? |
〇 |
| [4-1] |
HTML組込 |
H,l,t使用 |
H,l,t使用 |
〇 |
〇 |
? |
| [5-1] |
mailサーバ |
〇 |
〇 |
〇 |
〇 |
〇 |
|