最終更新: 2004/12/17 14:40:00
このページは、筑波大学 情報学類 3年生を対象とした 情報学類主専攻実験の、 テーマ K-3 (システム・プログラム) のためのページ(新城担当部分)です。この実験には、課題が2つあります。
実験テキスト:
2004年2学期では、次の日時までに課題を仕上げて指定された方法で提出 してください。
July August September Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 3 1 2 3 4 5 6 7 1 2 3 4 4 5 6 7 8 9 10 8 9 10 11 12 13 14 5 6 7 8 9 10 11 11 12 13 14 15 16 17 15 16 17 18 19 20 21 12 13 14 15 16 17 18 18 19 20 21 22 23 24 22 23 24 25 26 27 28 19 20 21 22 23 24 25 25 26 27 28 29 30 31 29 30 31 26 27 28 29 30 October November December Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa 1 2 1 2 3 4 5 6 1 2 3 4 3 4 5 6 7 8 9 7 8 9 10 11 12 13 5 6 7 8 9 10 11 10 11 12 13 14 15 16 14 15 16 17 18 19 20 12 13 14 15 16 17 18 17 18 19 20 21 22 23 21 22 23 24 25 26 27 19 20 21 22 23 24 25 24 25 26 27 28 29 30 28 29 30 26 27 28 29 30 31
この実験を取る人は、関連した講義を取るように してください。1学期の講義の中でも、実験に関連した話をします。
プログラムは、次の場所にあります。
~yas/slab-syspro/shell/
cp -rp などでコピーして使ってください。必要な部分は、次のファイルです。
command.c
command.h
lexer.c
lexer.h
parser.c
parser.h
executer.c
executer.h
mysh.c
parse()
構文解析器で、引数で与えられた1行を解析
し、pl_list, pipe_line, single_command という構造体からなる木構造を返
します。
parse() が返した木構造を解析して実行(画面に表示)するものが、 executer.c に含まれている関数です。 このサンプルは、木構造の内容を画面に表示するようになっています。
次のような手順で、executer.c を書き換えていくとよいでしょう。
fork() のタイミングには注意してください。内部コマンドの場合、fork() を してはいけません。ただし、標準出力がパイプの場合、まずパイプを作成して からfork() する必要があります。fork() すべきかどうかを、木を先読みして 調べる方法もあります。
配列と木構造の探索については、2年生の教科書を読み返して復習して下さい。 配列の場合には、「ループ」することが基本です。パイプラインは、再帰では なくループを使った方が簡単に実現できるようになっています。構造体の場合には、 関数呼び出し(場合によっては再帰呼び出し)を使います。 fork() する時には、2重に検索実行しないように気をつける必要があります。
ループの数は、1つとは限りません。2つのループを使った方が簡単な場合も あります。2つのループとは、2重ループではなくて、1つのループを2回や るものです。
for( i=0 ; i < n; i++ ) { } ... for( i=0 ; i < n; i++ ) { }
親子関係を調べるには、ps コマンドを使います。この時、意味はありません が、ps コマンドには、X ウインドウ関係のプログラム(すぐには終了しない) を使うとよいようです。
% csh本格的に調べるには、strace コマンドを使います。% emacs | ps -l
% emacs | kterm | ps -l
% sh
$ emacs | ps -l
$ emacs | kterm | ps -l
$
![]()
% strace -f -o sh.log shプロセスが実行していく過程でどのようにシステムコールを発行していったか の「足跡」をプロセスのトレース(trace)といいます。 strace (Linux) は、プロセスのトレースを表示するコマンドです。-f で、 fork() を越えて子プロセスまで追跡します。-o file で、画面(標準エラー) の代りに、ファイルに結果を落とすことができます。$ ls
$ ls | head
$ exit
% less sh.log
% egrep 'fork|pie|dup|exec|close|exit|wait' sh.log | less
% egrep 'fork|pie|dup|exec|exit|wait' sh.log | less
%
![]()
詳しくは、man strace を見てください。
~yas/slab-syspro/dir/dir-browser.rb
C言語で GTK+ (Gimp ToolKit) を直接使っても似たような外観になります。
GTK+ 以外の Tool Kit を使ってもかまいません。
ウインドウの親子関係。table を使ってレイアウトしている。 @table.attach() の引数は、グリッドの左、右、上、下の座標。
window (DirListLong < Gtk::Window) table (Gtk::Table) scrollClist (Gtk::ScrolledWindow) clist (DirListLongClist < Gtk::CList) label (Gtk::Label) entry (Gtk::Entry) open_button (Gtk::Button) quit_button (Gtk::Button)
三並 慶佐: Ruby/GTKプログラミング入門,技術評論社 (2002年). ISBN: 4774114685この本のサンプル・プログラムが次の場所にあります。
~yas/ruby/gtk/book/program/
7_8_2.rb と fileselection.rb が参考になります。
~yas/slab-syspro/dir/DirBrowser.java
ウインドウの親子関係は以下のようになっている。window (JPanel) に縦方向 に流し込んでレイアウトしている。ボタンを横に並べている所は、buttonPart でグループ化している。
this (DirBrowser extends JFrame) window (JPanel) scrollTable (JScrollPane) table (JTable) textField dirInfoBar (JLabel) buttonPart (JPanel) openButton (JButton) quitButton (JButton)