ppt file

システムプログラミング
第6回
システムコールのエラーメッセージ
ファイルシステム
情報工学科 篠埜 功
今日からの内容
• Linuxのシステムコールを用いたCプログラム
の作成
• 今日の内容
– システムコールのエラーメッセージについて
– ファイルシステム
システムコールについて
• システムコールとは、カーネル内のコードを呼び
出すためのC関数
• ファイル、ネットワーク、キーボード等、ハード
ウェアとのやりとりはすべてカーネルが行う。
ユーザはシステムコールを通じてカーネルに
ハードウェア操作を依頼する。
• 例えば、ファイルからデータを読み出す場合、
getc, fgetcなどのライブラリ関数を呼ぶが、どん
なライブラリ関数を呼んだとしても、最終的には
readシステムコールが呼ばれ、カーネル内部の
コードが実行される。
システムコールの実装
システムコールは、Cの関数であり、ライブラリファイル
/usr/lib64/libc.a に入っている。
$ gcc -print-file-name=libc.a で表示される。
システムコールであるCの関数の中で、ハードウェア割
り込みを起こす命令(トラップ命令)が実行される。これ
により、カーネルの割り込み処理部分に制御が移る。
トラップ命令実行時にシステムコールの番号を伝え、
それによってそれぞれのシステムコールに対応する
カーネルのコードに制御が移ることになる。
$ ar t /usr/lib64/libc.a | less
でlibc.aの中身のオブジェクトファイルリストが表示される。
write.o, read.oなどが入っている。
システムコールの番号
1 exit
2 fork
3 read
4 write
5 open
6 close
7 wait
8 creat
9 link
10 unlink
11 exec
12 chdir
…
今後の講義でシステムコールを少し
ずつ紹介する。各システムコールのC
関数が番号の設定を行うので番号は
知らなくてよい。
システムコールのマニュアル
システムコールはmanコマンドでマニュアルを表示できる。
例えば、
$ man -S 2 write
でwriteシステムコールのマニュアルが表示される。
$ man write
とすると、writeコマンドのマニュアルが表示される。
$ man –a write
とすると、writeの名前のマニュアルがすべて(PAGERがlessの
場合はqを押すごとに)順番に表示される。
manコマンドの-Sの引数には分類番号を入れる。1はコマンド、
2はシステムコール、3はライブラリ関数となっている。
システムコールのエラーメッセージ
• システムコールがエラーになった場合、エラー番
号がerrnoという外部変数に代入されている。こ
の番号を用いてエラーメッセージを出力するライ
ブラリ関数perrorがあるのでそれを用いる。
(errnoを直接使うプログラムは書かないほうがよ
い。)
• 例えば、$ ls aaa のように、lsコマンドで存在しな
いファイル名を指定した場合に、そのようなファ
イルは存在しないといったメッセージが出力され
る。ここではperror関数が用いられている。(その
ようにlsコマンドが実装されている。)
ライブラリ関数perror
void perror (char *s)
ライブラリ関数perrorは文字列(charへのポイ
ンタ)を引数として受け取り、それを出力し、コ
ロンと空白を出力したあとにシステムコールの
エラーメッセージを表示する。
ファイルの1文字目を表示する例
(入力して実行、後で詳述)
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#define ERR -1
int main (void) {
int fd, n;
char c;
if ((fd = open ("test",
O_RDONLY))
== ERR) {
perror ("open");
exit(1);}
/* 続き */
if ( (n = read (fd, &c, 1) ) > 0 )
printf ("1文字目は%cです。\n",
c);
if (n==ERR) {
perror ("read");
exit(1);
}
if (close (fd) == ERR) {
perror ("close");
exit(1);
}
return 0;
}
演習課題
さきほどのプログラムを参考にして、テキストファイルの2文字
目まで表示するプログラムをopenシステムコール, readシステ
ムコールを使って作成せよ。
(さきほどと同様、printfは使うことにする。)
ファイル、プロセス
• OS(Linux)は、ファイルとプロセスを木構造で
管理する。
• まず、ファイルの木構造について学習する。
ファイル操作のシステムコール
ファイルはOS(Linux)が管理している。
ファイルの操作等を行うためのシステムコー
ルが提供される。
open, creat, close, read, write, lseek, dup,
dup2等がある。
今日はopen, close, read, writeの解説を
行う。この前に、まず、ファイルの基本事
項の説明を行う。
ファイルとは
UNIX系OSではファイルは1つの木構造で管理され
る。ルートディレクトリ以外は、すべてのファイルに
は親(ディレクトリ)がある。
ディレクトリもファイルの一種であり、そのディレクト
リの子供のファイルの名前を保持しているファイル
である。ディレクトリファイルも、(ルートディレクトリ
以外は)何らかのディレクトリの子供である。
すべてのファイルはルートディレクトリから親子関
係を辿ることによって到達できる。
デバイスファイル
UNIXでは、端末、ディスク、磁気テープ、プリンタなど
の周辺機器やメモリなどの装置のそれぞれに対応す
るファイルがある。特殊ファイル、あるいはスペシャ
ルファイルとも呼ばれる。デバイスドライバに対する
インタフェースであり、ファイルを扱うシステムコール
で操作できる。これらのファイルは通常/devディレクト
リ以下にある。
デバイスは次の2種類に分けられる。
• キャラクタデバイス --- 端末やプリンタなど、文字単
位で入出力を行う装置
• ブロックデバイス --- ディスクや磁気テープ装置な
ど、データをある程度まとまったブロック単位で処理
する装置
ファイル名、パス名
• ファイルには、名前がある。それをファイル名と
いう。ディレクトリが違えば同じファイル名であっ
ても別のファイルである。
• パス名は、経路(パス)をファイル名の前につけ
たものである。
• ファイル名は255文字以内、パス名は4095文字
以内。大文字、小文字、数字、ピリオド、ハイフン、
アンダーバーが使える。ファイル名に日本語は
使えるが、現状では使わないのが無難。
絶対パス、相対パス
• 絶対パス --- ルートディレクトリから下向きに
辿るパス
• 相対パス --- 現在のディレクトリからの相対的
な経路で表すパス名で、上に行くこともある。
• ピリオド --- 現在のディレクトリ(current
directory)を表す。
• ピリオド2つ --- 親ディレクトリを表す。
(例) ../.. は2つ上の親のディレクトリを表す。
ピリオドの役割
ピリオド . はカレントディレクトリを表す。カレントディレクトリの
実行形式ファイルを実行するとき、
$ ./test
のようにして実行する。単にファイル名を
$ test
のように打った場合は、testという実行形式ファイルを、環境変
数PATHに格納されているディレクトリの中から順番に探すこと
になる。PATHに . が指定されていない場合は、カレントディレク
トリにtestがあっても実行できない。また、testという名前の実行
ファイルがシェルの内部コマンドだったり(実際は違うが)、他の
PATHの(順番が先になっている)ディレクトリにあると、そちらが
実行される。(実際に、/usr/bin/testが存在する。)
ホームディレクトリ
ログイン時のディレクトリをホームディレクトリと
いう。通常、/homeの下に作成される。(rootとい
うユーザ(スーパーユーザ)のホームディレクトリ
は/rootである)。演習室では、(私sasanoの場
合)/home/sitの下にある。ディレクトリを変更す
るコマンドがcd(シェルの内部コマンド)であり、
これはchdirシステムコールを使って実現されて
いる。ホームディレクトリはチルダ~で表される。
ファイルの保護
ファイルを他人(他のユーザ)に見られないように、
permissionの指定ができる。
$ ls –al
で確認できる。
d rwx rwx rwx
の最初の桁以外は変更できる。
最初がdだとディレクトリ、-は一般のファイル。
そのあとは、owner, group, otherに対する読み書
き実行の許可を表す。
(例) -rw-r—r--だと、一般ファイルで、所有者は
読み書き、グループメンバーとその他のユーザは
読み出しのみ許可。
Permissionの変更
Permissionの変更はchmodコマンドで行う。
$ chmod モード ファイル名
モードは、rwxの組を3桁の2進数と考え、これを
8進1桁で表わし、8進3桁で指定することができ
る。例えば、rw-r--r--にしたい場合は644とする。
chmodは、chmodシステムコールを使って実現
されている。
ファイルの所有者
ファイルには所有者、グループが関連づけられてい
る。
$ ls –l
で確認できる。
ファイルの所有者の変更はchownコマンド、グルー
プの変更はchgrpコマンドで行う。これらはchownシ
ステムコールを使って実現されている。ただし、所有
者とスーパーユーザ以外は変更できない。