Operating Systems. Exercise 13

I. ディレクトリ情報 (準備課題, 配点無し)

ディレクトリにもファイルと同様にパーミッションや更新日時などの情報が付加されており, ユーザは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