Operating Systems. Exercise 13
ディレクトリにもファイルと同様にパーミッションや更新日時などの情報が付加されており,
ユーザはOSが管理するファイルシステムからそれらの情報を取得することができます。
ディレクトリをオープンすると、readdirによりディレクトリ内部のファイル/ディレクトリ名を
得ることができます。
以下のプログラムを実行し, 各処理を理解してください。
DirOpen.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
void PrintDirEntries();
int main (int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr,"usage:\n\t%s directory_name\n", argv[0]);
exit(1);
}
PrintDirEntries(argv[1]);
return 0;
}
void PrintDirEntries() {
struct dirent *pDirEntry;
DIR *dirpIn = opendir(argv[1]);
if (dirpIn == NULL) {
perror("Opening directory failed....");
exit(1);
}
//ディレクトリ内のファイル/ディレクトリ情報を1つずつ取得
pDirEntry = readdir(dirpIn);
//もうディレクトリ内のファイル/ディレクトリが無ければNULLなのでループ終了
while (pDirEntry != NULL) {
//ファイル/ディレクトリ名を出力
printf("%s\n", pDirEntry->d_name);
//次のディレクトリ内のファイル/ディレクトリ情報を取得
pDirEntry = readdir(dirpIn);
}
closedir(dirpIn);
}
II. ファイル/ディレクトリ情報表示 (配点100%)
導入: 先週の課題では、ファイルのみに対応した"ls -l"コマンドである"lsl"を作成しました。
コマンド
% ./lsl FileStat.c
結果
-rw------- 1 user group 3758 8 17 18:08 FileStat.c
"lsl"をディレクトリ(以下の例ではカレントディレクトリ)に対して使用すると以下のようになります。
コマンド
% ./lsl .
結果
drwxr-xr-x 3 user group 4096 8 24 15:48 .
本来、"ls -l"をディレクトリに対して使用すると、以下のようにディレクトリ内の子ディレクトリ/ファイル情報を
表示しますので、"lsl"コマンドは"ls -l"のクローンとしては不完全です。
コマンド
% ./lsl .
結果
-rwxr-xr-x 1 user group 7783 8 2 15:26 FileStat
-rw-r--r-- 1 user group 3766 8 2 15:25 FileStat.c
-rw-r--r-- 1 user group 3179 6 4 14:27 FileStat.c~
-rwxr-xr-x 1 user group 7775 8 2 15:23 lsl
-rw-r--r-- 1 user group 3036 8 2 15:20 lsl.c
-rw-r--r-- 1 user group 2966 8 2 15:12 lsl.c~
課題
先週作成した"lsl"を発展させて、
引数で与えられたファイル/ディレクトリ共に"ls -l"と同じ形式で出力するプログラム"lsl2"を
作成してください。
例:
コマンド
% ./lsl2 DirOpen.c
結果
-rw------- 1 user group 988 8 24 18:08 DirOpen.c
コマンド
% ./lsl2 .
結果
-rwx------ 1 user group 7398 8 24 18:09 DirOpen
-rw------- 1 user group 988 8 24 18:08 DirOpen.c
-rw------- 1 user group 748 8 24 17:38 DirOpen.c~
-rwx------ 1 user group 7985 8 24 19:00 lsl2
-rw------- 1 user group 3502 8 24 18:58 lsl2.c
コマンド
% ./lsl2 ..
結果
drwxr-xr-x 3 user group 4096 6 2 11:34 ex01
drwxr-xr-x 2 user group 4096 6 2 11:34 ex02
drwxr-xr-x 2 user group 4096 6 2 11:34 ex03
drwxr-xr-x 2 user group 4096 5 2 17:21 ex04
drwxr-xr-x 4 user group 4096 6 14 15:03 ex05
drwxr-xr-x 4 user group 4096 6 23 12:41 ex07
drwxr-xr-x 4 user group 4096 6 16 12:51 ex06
drwxr-xr-x 4 user group 4096 7 14 11:58 ex09
drwxr-xr-x 4 user group 4096 7 19 10:13 ex10
drwxr-xr-x 4 user group 4096 7 20 19:00 ex11
drwxr-xr-x 4 user group 4096 7 28 12:47 ex12
drwxr-xr-x 3 user group 4096 8 17 18:30 ex13
コマンド
% ./lsl2 ~
結果
drwx------ 3 user group 4096 4 4 15:18 dic
drwx------ 9 user group 4096 10 11 11:27 Mail
drwx------ 3 user group 4096 5 2 17:19 Documents
drwx------ 4 user group 4096 5 2 17:19 Desktop
drwx------ 3 user group 4096 7 9 16:28 tmp
drwx------ 30 user group 4096 5 16 18:42 Library
drwx------ 2 user group 8192 5 2 17:19 Downloads
drwx------ 2 user group 4096 5 2 17:19 Movies
drwx------ 2 user group 4096 5 2 17:19 Music
drwx------ 2 user group 4096 5 2 17:19 Pictures
drwxr-xr-x 3 user group 4096 5 2 17:19 Public