コンピュータ基礎演習 ースタックー

コンピュータ基礎演習
ーUNIX環境ー
岩井 儀雄
[email protected]
UNIX OS




1970頃AT&T社のBell研究所の研究員K.
ThompsonとD. Ritchieらにより開発さ
れた.その後,大学,研究所を中心に
広く普及,発展した.
AT&Tが製品化した System V系
UC Berkley で開発された BSD 系
Linux Kernel

UNIX互換OS
端末(terminal)

ホストコンピュータの末端装置
network
メインフレーム
コンソール
(console)
端末
(terminal)
仮想端末(Virtual terminal)

1台のWSに複数の端末が存在するよう
に見せる技術
仮想端末
仮想端末を提供する
プログラムを
ターミナルソフトと呼ぶ
ターミナルソフトウェアの
起動と終了(GNOME)

起動方法




画面の下の
のアイコンをクリック
画面左下の
をクリックしてシステム→日本語
端末へ
もう一つ端末を立ち上げるには kterm & とコマンド
入力するか,上を繰り返す
終了方法


とコマンド入力する
Control-D を入力する
exit
Shell(シェル)





計算機に作業をさせるには,コマンドを入力す
ることによって行う
Shell は,入力されたコマンドを解釈し,実行す
るプログラム
UNIX OS とユーザとのインターフェイス
Shell はプログラミング言語(インタプリタ)と
して動作する
ターミナルを起動すると,Shell を実行するプロ
セスが起動する
Shell の種類

Bourne shell 系


sh, bash,
C shell 系

csh, tcsh
Shell の動作
開始
プロンプトの出力
コマンド行の読み込み
コマンド行の解析
終了
yes
no
終
了
Shellの処理の流れ図
コマンドの実行
Shell の動作例
Linux 2.0.31 (dorado) (ttyp0)
dorado login: iwai ← login 操作(ユーザ名とパスワード入力)
Password:
Linux 2.0.31.
Last login: Thu Nov 11 13:34:28 on tty1.
No mail.
iwai@dorado% cal ← コマンド入力(カレンダーを表示する)
July 2003
S M Tu W Th F S
1 2 3 4 5
6 7 8 9 10 11 12 ←その結果(今月のカレンダーを表示)
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
iwai@dorado%
プロンプト
コマンド
(書式)コマンド名
オプション
引数
[例]ls:ファイルの情報を表示するコマンド(list)
オプションとしては,-a, -l, -t, -F …
ls
[実行例] Iwai@dorado%
Desktop/ Library/ Music/ Public/
Documents/ Movies/ Pictures/ Sites/
Iwai@dorado% ls -l
total 0
drwx------ 4 iwai staff 136 May 8 02:43 Desktop/
drwx------ 5 iwai staff 170 May 7 14:55 Documents/
drwx------ 22 iwai staff 748 Apr 1 15:27 Library/
drwx------ 3 iwai staff 102 Mar 27 03:23 Movies/
drwx------ 3 iwai staff 102 Mar 27 03:23 Music/
drwxrwx--- 5 iwai staff 170 May 15 00:15 Pictures/
drwxr-xr-x 4 iwai staff 136 Mar 27 03:23 Public/
drwxr-xr-x 5 iwai staff 170 Mar 27 03:23 Sites/
コマンド(2)
よく使うコマンド
ar, as, cc, cd, cp, emacs, find, grep, kill, ld,
less, more, man, mkdir, mv, ps, pwd, rm, rmdir,
tar, vi, which, who, …
オンラインマニュアル
man コマンド名
man man
コマンド(3)

セミコロン (;)


コマンドは1つの改行で終わる
セミコロンもコマンドの区切りに利用できる
[dorado:~] iwai% who
iwai
console Jul 8 10:51
iwai
ttyp1 Jul 8 13:50
[dorado:~] iwai% date;
Tue Jul 8 14:03:25 JST 2003
[dorado:~] iwai% date; who
Tue Jul 8 14:03:29 JST 2003
iwai
console Jul 8 10:51
iwai
ttyp1 Jul 8 13:50
コマンド(4)

Back quote (`…`)


括弧 ( … )


… のコマンド群を実行する.シェルの出力は
`…` に置換される
… のコマンド群をサブシェルで実行する
中括弧{…}

… のコマンド群をカレントシェルで実行する
(めったに使わない)
コマンドのフォアグラウンド
実行とバックグラウンド実行


UNIX OS はマルチタスクOS
複数のコマンド(ジョブ)を同時に実行でき
る

フォアグラウンド実行


ターミナルの入力が実行中のジョブに渡される.(ター
ミナルのシェルに入力を渡すことができなくなる)
バックグラウンド実行


ターミナルの入力はシェルに渡されたまま
キーボード入力を必要とするコマンドはバックグラウン
ド実行すると,入力がないので suspend (一時停止)状
態になる
Shell によるジョブ制御

コマンド(ジョブ)の制御




フォアグラウンドにする(1つのみ)
バックグラウンドにする
ジョブの停止,強制終了
ジョブの状態確認
ジョブ制御の例
[dorado:~] iwai%
[1] 563
[dorado:~] iwai%
[2] 565
[dorado:~] iwai%
[1] + Running
[2] - Running
[dorado:~] iwai%
kterm
kterm & ←(コマンドのバックグラウンド実行)
←(ジョブ番号とプロセス番号)
emacs &
jobs
fg %1
←(実行中のジョブ表示)
kterm
emacs
← (ジョブ番号1をフォアグラウンドに)
←(フォアグランドになったので入力できなくなる)
^Z
←(suspend キーを押す.通常 Control-Z に割当られている)
Suspended
← (コマンドが一時停止状態になったことを示す)
[dorado:~] iwai% jobs
[1] + Suspended
kterm
[2] - Running
emacs
[dorado:~] iwai% bg %1 ← (ジョブ番号1をバックグラウンドに)
[1] kterm &
[dorado:~] iwai% kill %1 ← (ジョブ番号1を強制終了)
ジョブ制御のシェルコマンド

fg [%ジョブ番号] ([]内は省略可能)


bg [%ジョブ番号]


ジョブの状態表示
Suspend Key: Control-Z(割当変更可能)


ジョブを強制終了
jobs


ジョブをバックグラウンドにする
kill %ジョブ番号


ジョブをフォアグラウンドにする
プログラムが一時停止状態になる
Interrupt Key: Control-C(割当変更可能)

プログラムが強制終了する
まとめ:ジョブの状態
通常起動
fg
Foreground
&起動
Suspend
bg
Ctrl-Z
Kill
Ctrl-C
fg
Background
Terminate
kill
bg
kill
エディタ Editor


テキストやプログラムの作成・編集を行うプログラム
エディタの種類

ラインエディタ


ストリームエディタ


行の概念をもち,テキストの編集を行単位で行うもの.ed, ex など.
編集作業内容をプログラム化し,標準入力から入力されたテキストを
編集して,標準出力へ出力するもの.sed, awk など.非対話型エ
ディタ.
スクリーンエディタ

画面全体を用いて,画像中のカーソルを中心にした編集を行うもの.
vi, emacs など.
ファイル構造


UNIX OS に限らずにほとんどのOS (DOS, Windows, Mac
OSなど)ではファイル構造は「木構造」になっている.
UNIX OS のファイルシステムでは,ノードはファイル,
ディレクトリ,リンク(シンボリックリンク)の3通り
/ ルートディレクトリ
bin
dev
etc
lib
sbin
bin
a2ps
jlatex
mv
etc
cp
usr
lib
ls
libexec
…
var
local
tmp
sbin
特殊なディレクトリ名
.
カレントディレクトリ(pwdで確認できる)
..
一つ上のディレクトリ
/
ルートディレクトリ
~USER USERのホームディレクトリ
パス名 path

ルートからファイルのある場所を指定する経路.
/ で区切って表す.


(例)/usr/bin/ls
絶対パス

ルートから記述


(例)/usr/local/bin/latex
相対パス

カレントディレクトリから記述

(例)./bin/latex
ディレクトリの操作

pwd


cd


ディレクトリの中身を表示
mkdir ディレクトリ名


指定されたディレクトリに移動
ls


ホームディレクトリへ移動
cd ディレクトリ名


カレントディレクトリのパス名表示(参考 dirs)
指定されたディレクトリを作成
rmdir ディレクトリ名

指定されたディレクトリを削除
ファイルの属性

ファイルの管理,保護に必要な情報



ファイル名,作成・更新日時,ファイルサイズ
所有者,所有者の所属するグループ
保護モード


所有者,所有者の所属するグループ,その他の
ユーザに対して,それぞれ読み,書き,実行,
setuid, sticky の指定をする
ls で確認できる
ファイル属性の例
[dorado:/tmp] iwai% ls -ld /tmp
lrwxrwxr-t 1 root admin 11 Jul 5 11:02 /tmp@ -> private/tmp
↑シンボリックリンクを表す(symbolic link)
[dorado:/tmp] iwai% ls -la /tmp/
total 8
drwxrwxrwt 7 root wheel 238 Jul 5 13:34 ./
drwxr-xr-x 6 root wheel 204 Jul 5 10:59 ../
-r--r--r-- 1 iwai wheel 11 Jul 5 13:34 .X0-lock
drwxrwxrwt 3 iwai wheel 102 Jul 5 13:34 .X11-unix/
drwxrwxrwx 3 root wheel 102 Jul 5 10:59 .iroha_unix/
↑d はディレクトリを示す.青の領域はユーザ,
黒は所属グループ,赤は他のユーザ
それぞれ,r(ead), w(rite), (e)x(ecute) の許可を示す
t は sticky が on になっていることを示す.
sticky の付いた directory は,ファイルの追加は可能だが,削除に制限
→そのファイルの書き込み権限のあるユーザのみ消去可能
ファイル属性の変更

chmod コマンドを利用 (change mode)
chmod [ugo]+/-[rwxst] パス名
実行例
[dorado:/tmp] iwai% ls -l
total 1
-rw-r--r-- 1 iwai wheel 9 Jul 5 14:50 hoge
[dorado:/tmp] iwai% chmod +x hoge
[dorado:/tmp] iwai% ls -l hoge
-rwxr-xr-x 1 iwai wheel 9 Jul 5 14:50 hoge*
[dorado:/tmp] iwai% chmod u+s hoge
[dorado:/tmp] iwai% ls -l hoge
-rwsr-xr-x 1 iwai wheel 9 Jul 5 14:50 hoge*
[dorado:/tmp] iwai% chmod u-sw hoge
[dorado:/tmp] iwai% ls -l hoge
-r-xr-xr-x 1 iwai wheel 9 Jul 5 14:50 hoge*
リダイレクト

コマンドの標準入出力・標準エラー出力をファイルに
切り替えること

ファイルから入力


ファイルへ出力


Command > FILE
ファイルへ追加


Command < FILE
Command >> FILE
出力とエラー出力をファイルへ

Command >& FILE
例
ls > aaa.list
cat < aaa.list > bbb.list
パイプ

前のコマンドの出力を次のコマンドの入力に
流し込む

前の標準出力を次の標準入力に


command1 | command2
前の標準出力とエラー出力を次の標準入力に

command1 |& command2
例
ls -al | more
ls -al | grep ’test*.c’
ターミナルでのコンパイルの
実行(C言語の場合)
プログラム名は,abc.c のように .c (拡張子)で終わるようにする
cc -o def abc.c
と入力すると,abc.c をコンパイルし,必要なライブラリをリンクして
def という名前の実行ファイルを作成する
(./def と入力すると,プログラム abc.c が実行される)
-o def を省略すると,a.out という実行ファイル名ができる.
コンパイル時の動作
cc -o def abc.c
cc の起動
.c から
Cコンパイラ
起動
.s
アセンブラ
出力
オブジェクト
ファイル .o
出力
アセンブラ
起動
リンカ起動
実行形式
ファイル出力
crt1.o
(OSとのインターフェイス)
libc.a (libc.so)
(標準Cライブラリ)
-o 実行形式ファイル名
分割コンパイル


プログラムを作成する際に,ソースコードを
機能単位毎に複数のファイルに分割すること
がよくある
一般にコンパイル時間はソースファイルの複
雑さに比例するので,一部の修正だけで全部
コンパイルするより,修正のあったファイル
だけコンパイルしたほうが作業効率が良い
分割コンパイル例
ファイルの依存関係
main.c
extern Foo
extern Bar
Foo.c
Foo() {…}
cc -c Bar.c コンパイル
cc -c Foo.c
cc -c main.c
cc -o sample main.o Foo.o Bar.o
リンク
Bar.c
Bar() {…}
-c オプション
コンパイルのみで
リンカを起動しない
作業ファイルを含めたファイルの依存関係
main.c
Foo.c
Bar.c
ソースコード
計算機言語
compiler / assembler
main.o
Foo.o
linker
Libc.a
crt1.o
sample
Bar.o
中間生成物
オブジェクトコード
機械語+再配置情報
最終生成物(実行形式)
機械語+ローダ情報
分割コンパイル

利点



開発時のコンパイル時間の短縮
モジュール,関数の再利用の促進
どのようなときに使うか


多人数でのプログラム開発
大規模なプログラム開発
ヘッダファイル header file



各モジュールの外部仕様を記述したC言語ま
たはC++言語用のファイル
拡張子は .h
ヘッダファイルに記述されているもの




関数,変数の extern 宣言
マクロ宣言
型の typedef
ヘッダファイルに記述してはいけないもの

関数,変数の定義(2重定義エラーを起こす)
ヘッダファイルの利用例
/* Foo.h */
#ifndef Foo_H_
#define Foo_H_
extern int Foo(int x);
extern int FooGlobal;
#endif
/* Foo.c */
#include “Foo.h”
int FooGlobal;
int Foo(int x)
{
return FooGlobal+x;
}
/* main.c */
#include <stdio.h>
#include “Foo.h”
int main()
{
FooGlobal = 1;
printf( “Foo = %d\n”, Foo(3) );
return 0;
}
モジュール: Foo
ヘッダファイル

利点



モジュールの外部仕様なので,ヘッダファイルを
include することで,そのモジュールを再利用でき
る.
マクロや定数などをヘッダファイルで1元管理が
できるので,人為ミスを減少させることができる.
欠点


複数回ヘッダファイルが読み込まれることを工夫
しないとコンパイル効率が悪い
外部仕様以外のことも書くことができてしまう

変数定義が書けてしまう(2重定義エラーを起こす)
make



ソースファイルやヘッダファイルが修
正されたとき,その依存関係に従って
再コンパイルが必要
大規模なソフトウェアの場合,手作業
では不可能
そこで,make が開発された
make


Makefile または makefile というファイ
ルにファイルの依存関係と,処理方法
を記述
部分的にファイルの変更があった場合,
その依存関係に従って,変更が及ぶ範
囲だけを処理する
Make の例
ファイル 依存しているファイル
main.c Foo.h Bar.h
Foo.c
Foo.h
Bar.c
Bar.h
main.o main.c
Foo.o
Foo.c
Bar.o
Bar.c
sample main.o Foo.o Bar.o
Foo.h
Bar.h
main.c
Foo.c
Bar.c
main.o
Foo.o
Bar.o
sample
このような構造を
DAG (Directed Acyclic Graph)という
Makefile の例
# makefile の例
all: sample
← #から始まる行はコメント
← all というターゲットは sample に依存する(慣例的にallを使う)
sample: main.o Foo.o Bar.o
cc -o $@ main.o Foo.o Bar.o ←リンク,$@はターゲット名を示すマクロ
main.o: main.c Foo.h Bar.h
cc -o $@ -c main.c
Foo.o: Foo.c Foo.h
cc -o $@ -c Foo.c
Bar.o: Bar.c Bar.h
cc -o $@ -c Bar.c
Makefile
[書式]
ターゲット: 依存ファイル(ソース)
(TAB)ターゲットを作成するのに必要なコマンド
Makefile を main.c, Foo.c, Foo.h, Bar.c, Bar.h のあるディレクトリにおき,make を実
行すると
cc -o main.o -c main.c
cc -o Foo.o -c Foo.c
cc -o Bar.o -c Bar.c
cc -o sample main.o Foo.o Bar.o
が実行される .このあと,main.c だけを変更して make を実行すると,
Cc -o main.o -c main.c
Cc -o sample main.o Foo.o Bar.o
が実行される
Makefile の説明

マクロ


Makefile 中の文字列を別の文字列で参照で
きるようにする
[書式]


マクロ名 = 値
マクロの展開

$(マクロ名) または ${マクロ名}
Makefile の説明

慣習的に使われるマクロ名(代表的なも
マクロ名
用途
の)
CC
Cコンパイラの実行プログラム名
CFLAGS
Cコンパイラに与えるオプション
CXX
C++コンパイラの実行プログラム名
CXXFLAGS
C++コンパイラに与えるオプション
AS
アセンブラの実行プログラム名
ASFLAGS
アセンブラに与えるオプション
LD
リンカの実行プログラム名
LDFLAGS
リンカに与えるオプション
SRCS
ソースファイル
OBJS
オブジェクトファイル
INCLUDES
インクルードファイル指定
マクロの使用例
TARGET = sample
CC = gcc
CXX = g++3
OBJS = sample.o
SRCS = sample.cc
all: $(TARGET)
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) -o $@ $(OBJS)
特殊なマクロ




@
*
<
?
ターゲットのファイル名
ターゲットのファイル名から拡張子を除いたもの
最初の依存ファイルのソース名
ターゲットよりも新しいソース名