• 検索結果がありません。

ファイル関連のその他の各種システムコール

ドキュメント内 新潟大学学術リポジトリ (ページ 148-158)

• 関数引数の sizeは 配列bufの大きさを表す。

現在の作業ディレクトリ変更のためのシステムコール chdir( ) と fchdir( ):

• 各々の関数のプロトタイプは<unistd.h> で次の様に定義されている。

int chdir(char *path);

int fchdir(int fd);

• この関数を使うためにはヘッダファイル <unistd.h> を必要とする。

• chdir( ) や fchdir( )が呼ばれると、引数で指定されたディレクトリに作業ディレ クトリを移す。成功すると 0 を返し、失敗すると −1 を返す。

• 関数引数の path は ファイルをフルパスで指定した文字列を表す。

• 関数引数の fd は ファイル記述子を表す。

ディレクトリ作成のためのシステムコール int mkdir(char *path, mode t mode):

• この関数を使うためにはヘッダファイル <unistd.h> と<fcntl.h> を必要とする。

• mkdir( ) が呼ばれると、引数の指定に従ってディレクトリが新たに作成される。成

功すると 0 を返し、失敗すると −1を返す。

• 関数引数の path は、作成するディレクトリを指定した文字列を表す。

• 関数引数の mode は、作成ディレクトリの保護モードを表す。

ディレクトリ削除のためのシステムコール int rmdir(char *path):

• この関数を使うためにはヘッダファイル <unistd.h> を必要とする。

• rmdir( ) が呼ばれると、引数で指定されたディレクトリが削除される。削除するディ

レクトリは空でなければならない。成功すると 0を返し、失敗すると −1 を返す。

• 関数引数の path は、作成するディレクトリを指定した文字列を表す。

10.8. ファイル関連のその他の各種システムコール 143

(ハード)リンクを張るためのシステムコール int link(char *path, char *newpath):

• この関数を使うためにはヘッダファイル <unistd.h> を必要とする。

• link( ) が呼ばれると、第1引数で指定されたファイルへの新しいリンクを張る。同

時にリンク先のファイルに付随したi-ノード中の「ハードリンク数」が1だけ増やさ れる。成功すると0を返し、(新しく張るリンクと同じものが既にある等の理由で)失 敗すると −1 を返す。

• 関数引数の pathは、既に存在するリンク名を指定した文字列を表す。

• 関数引数の newpath は、新しいリンク名を指定した文字列を表す。

umask値を変更するためのシステムコール mode t umask(mode t mask):

ファイルやディレクトリを生成する時、open( ) や creat( ) の引数の指定がどうなっ ているかに拘わらず常にアクセスを拒否することを指定出来る。 アクセス設定を常に拒 否するかどうかを表す9 ビットの値を umask値と言う。 (1がアクセス拒否を表す。)

umask値はプログラム/環境毎に設定され、環境変数の様に振る舞う。(しかし、umaskと

いうシェル変数がある訳ではない。) umask値は大抵のシステムでは 0または 022に初 期設定される。

• この関数を使うためにはヘッダファイル <sys/types.h> と<sys/stat.h> を必要と する。

• umask( ) が呼ばれると、引数で指定された通りにumask値が設定され、古いumask 値が関数値として返される。

• 関数引数の modeは 新しいumask値を表す。

ファイルへのアクセスチェックのためのシステムコール access( ):

• 関数プロトタイプは次の通り。

int access(char *path, int acccesstype);

• この関数を使うためにはヘッダファイル <unistd.h> を必要とする。

• access( ) が呼ばれると、第1引数で指定されたファイルに対して第2引数で指定し

たアクセスが全て可能かどうかの判定を行う。実行しているプロセスの実効ユーザ, 実効グループではなく、実ユーザ,実グループの権限でファイルにアクセスできるかど うかの判定である。全てアクセス可能なら 0を返し、それ以外の場合は−1を返す。

• 関数引数の pathは、アクセス可能性を判定するファイルを指定した文字列を表す。

• 関数引数の acccesstype は、どういう種類のアクセスについて調べるかを表したも ので、次のマクロをOR演算子(|)で繋げて指定する。

R OK · · · 読み込み可能かどうかを調べる。

W OK · · · 書き込み可能かどうかを調べる。

X OK · · · 実行可能かどうかを調べる。

F OK · · · ファイルが存在するかどうかを調べる。

システムバッファの内容をディスクに書き出すためのシステムコール void sync( ):

• syncコマンドに対応。

• この関数を使うためにはヘッダファイル <unistd.h> を必要とする。

• sync( ) が呼ばれると、システムバッファ内のデータがディスクに書き込まれ、ディ

スク内のデータが最新のものに保たれる。

• 不用意にvoid sync( )システムコールを多用するとシステムの性能低下を引き起こ

す可能性がある。

演習問題

□演習 10.6 UNIXにおいて、i-nodeを使って木構造のファイルシステムがどの様に構 築されるか説明せよ。

□演習 10.7 UNIXの木構造のファイルシステムにおいて、

(1) ルートディレクトリからファイル /bin/cat に至る部分がi-nodeを使ってどの様に 構築されているかを図示せよ。

(2) ファイル/bin/cat のデータブロックへのアクセスが具体的にファイルシステム内部

でどの様に行われるかを説明せよ。

□演習 10.8 UNIXにおいて、どんな種類のファイルがあるか?

□演習 10.9 次のCプログラムを実行するとどういう出力が得られるか? 下の 部分に予想される出力文字列を入れよ。但し、ここでは空白は と明示せよ。

[motoki@x205a]$ cat test0302-2.c

#include <ctype.h>

#include <fcntl.h>

#include <unistd.h>

#define BUFSIZE 1024

int main(int argc, char **argv) {

char buffer[BUFSIZE];

int in_fd, out_fd, in_size, k;

in_fd = open(argv[1], O_RDONLY);

out_fd = open(argv[2], O_WRONLY|O_EXCL|O_CREAT, 0644);

while ((in_size=read(in_fd, buffer, BUFSIZE)) > 0) { for (k=0; k<in_size; k++) {

if (islower(buffer[k]))

buffer[k]=toupper(buffer[k]);

}

10.8. ファイル関連のその他の各種システムコール 145

write(out_fd, buffer, in_size);

}

close(in_fd);

close(out_fd);

return 0;

}

[motoki@x205a]$ cat test0302-2data Enter Hamlet.

Ham To be, or not to be:

that is the question: ...

[motoki@x205a]$ gcc test0302-2.c [motoki@x205a]$ ls out

ls: out: そのようなファイルやディレクトリはありません

[motoki@x205a]$ ./a.out test0302-2data out [motoki@x205a]$ cat out

[motoki@x205a]$

□演習 10.10 次のCプログラムを実行するとどういう出力が得られるか? 下の

部分に予想される出力文字列を入れよ。但し、ここでは空白は と明示せよ。

[motoki@x205a]$ nl test0402-3.c 1 #include <stdio.h>

2 #include <stdlib.h>

3 #include <dirent.h>

4 int main(int argc, char *argv[]) 5 {

6 DIR *dir;

7 struct dirent *ptr_to_dir_entry;

8 int num;

9 if (argc != 2) {

10 printf("Give a directory_name as a command parameter.\n");

11 exit(EXIT_FAILURE);

12 }else if ((dir=opendir(argv[1])) == NULL) { 13 perror("opendir");

14 exit(EXIT_FAILURE);

15 }

16 num=0;

17 while ((ptr_to_dir_entry=readdir(dir)) != NULL)

18 printf("%3d : %s\n", ++num, ptr_to_dir_entry->d_name);

19 printf("Given directory contains %d files.\n", num);

20

21 closedir(dir);

22 return 0;

23 }

[motoki@x205a]$ gcc test0402-3.c [motoki@x205a]$ ls -a -f

./ zaseki0402.tex a.out* Test0402.tex test0402-3.c ../ alltt.sty@ Test0312.tex Old/ test0402-4.c [motoki@x205a]$ ./a.out .

[motoki@x205a]$

147

11 自習 プロセス情報獲得のシステムコール

プロセスに関する各種IDを調べる,

プロセスの消費時間を調べる,

プロセスの優先度,資源利用制限,資源利用情報 を調べる

'

&

$

% p.87からの引用:

プロセス管理表: プロセスの管理/seamlessな切替えのためにOSが必要と する情報は全てプロセス管理表(process control table;プロセス表,プロセス制 御ブロック,...とも言う)に保持され、主記憶内の常駐領域に置かれる。プロセス 管理表には次の様な情報が入っている。

名前· · ·人間がプロセスを識別するために付けた名前

識別子 · · ·プロセスの識別子(PID),親プロセスの識別子(PPID),プロセ

スが属するグループの識別子

所有者情報· · ·プロセスの所有者のID,グループID

動作状態· · ·プロセスの動作状態,イベント待ちの要因

シグナル情報· · · イベント待ちマスク

時間情報· · · プロセス起動時の時間,これまでに消費したCPU時間,子プロ

セスのしたCPU時間

プロセスの優先度· · · スケジューリングの参考にされる。

保護情報· · ·他のどのプロセスに資源操作やプロセス間通信を許すかを明ら

かにする。

走行情報· · · プロセス停止時点でのプログラムカウンタ,プログラム状態語

を始めとした各種レジスタやスタックポインタの内容

プログラム情報· · ·プロセスがどのロードモジュールを使って実行している かを示す。

空間情報· · ·プロセスが利用している実メモリ空間や仮想メモリ空間に関す

る情報

資源情報· · · ファイルや入出力装置、セマフォなどの、操作している資源を

管理する表へのポインタなど

常駐カーネル

プロセス1 の領域 プロセス2

の領域

常駐領域

ユーザ領域

主記憶 プロセス管理表 プロセス

管理表 プロセス

・・・ 管理表

・・・

プロセス2 の領域 プロセス1 の領域 プロセス1 の領域

・・・ ・・・

・・・

・・・

・・・

・・・

ページングによる

(仮想記憶 )

11.1 プロセスの ID, 実ユーザ ID, 実効ユーザ ID, ... を調べる

C.オール4.2.1–4, D.A.Curry 6,大倉

&谷田部13,日下部&谷田部8

まず最初に、プロセスのID, グループID, 親プロセスのID, 実ユーザID, 実効ユーザ ID, 実グループユーザID, 実効グループユーザID を調べるためのシステムコールを紹 介する。

プロセスIDを得るためのシステムコール pid t getpid(void):

• この関数を使うためにはヘッダファイル <unistd.h> を必要とする。

• getpid( ) が呼ばれると、(呼んだ)プロセスのID番号が返される。

• プロセスIDのデータ型 pid t の実体は intである。

'

&

$

% 例えば、

VineLinux2.1.4の場合、/usr/include/bits/types.h typedef int pid t;

と定義され、/usr/include/unistd.h typedef pid t pid t;

と定義されている。

プロセスグループIDを得るためのシステムコール pid t getpgrp(void):

• この関数を使うためにはヘッダファイル <unistd.h> を必要とする。

• getpgrp( ) が呼ばれると、(呼んだ)プロセスのグループIDが返される。

親プロセスのIDを得るためのシステムコール pid t getppid(void):

• この関数を使うためにはヘッダファイル <unistd.h> を必要とする。

• getppid( ) が呼ばれると、親プロセスのID番号が返される。

プロセスの実ユーザIDを得るためのシステムコール uid t getuid(void):

• この関数を使うためにはヘッダファイル <unistd.h> を必要とする。

• getuid( ) が呼ばれると、プロセスの実ユーザIDが返される。

実ユーザID(real user ID):

プロセスを起動したユーザのIDのこと。

プロセスの実効ユーザIDを得るためのシステムコール uid t geteuid(void):

• この関数を使うためにはヘッダファイル <unistd.h> を必要とする。

• geteuid( ) が呼ばれると、プロセスの実効ユーザIDが返される。

'

&

$

% 実効ユーザID(effective user ID):

アクセス許可の判定に使用されるユーザ IDのこと。

通常は実ユーザIDと同じであるが、setuid( )シス テムコールによって変更されることもある。

プロセスの実グループIDを得るためのシステムコール gid t getgid(void):

• この関数を使うためにはヘッダファイル <unistd.h> を必要とする。

• getgid( ) が呼ばれると、プロセスの実グループIDが返される。

実グループID(real user ID):

プロセスを起動したユーザのグループIDのこと。

プロセスの実効グループIDを得るためのシステムコール gid t getegid(void):

• この関数を使うためにはヘッダファイル <unistd.h> を必要とする。

ドキュメント内 新潟大学学術リポジトリ (ページ 148-158)