課題 C-1

問題

UNIX という OS が C 言語で記述されていることは知っている人も多いであろう. ここでは,その一部を体験してみよう.

まず,サンプルプログラム C1-hint.c を見てもらいたい. 短いプログラムであるが,これを実行するとカレントディレクトリの中身が表示される.
重要なのは readdir 関数が返すポインタ(構造体 dirent へのポインタ)である. 構造体 dirent は次のように定義されている:
struct dirent {
       ino_t          d_ino;       /* inode 番号 */
       off_t          d_off;       /* 次の dirent へのオフセット */
       unsigned short d_reclen;    /* このレコードの長さ */
       unsigned char  d_type;      /* ファイル種別 */
       char           d_name[256]; /* ファイル名 */
 };   
このように UNIX では,ファイルの情報を構造体に格納し, そのポインタを関数の戻り値として渡すというのが常套手段になっている.
(本演習で構造体とポインタにこだわった理由がお分かりいただけたであろうか?)

このサンプルプログラムを参考に,簡易的な ls コマンドとして動作するプログラムを作成しなさい.
プログラムの仕様は次の通りとする:

  1. 実行後,すぐにディレクトリ名を読み込む.
    指定ディレクトリをオープンできなかった場合はエラーメッセージを表示して終了.
  2. ファイル/サブディレクトリ名を辞書式順に( 1 行に 1 個)表示する. ただし,ファイル/サブディレクトリの個数は 256 個以下に限定してよい. 256 個を越える場合は,最初の 256 個だけで処理を行い, 最後に 「xx 個のファイル/サブディレクトリを処理できませんでした」 という警告メッセージを表示する.
※オンラインマニュアルも参照するとよい.コマンドは 「jman 3 opendir」, 「jman 3 readdir」

(C) 2006 Hirohisa AMAN <aman@cs.ehime-u.ac.jp, aman@computer.org>