プロセスの生成とコマンドの実行 プロセスの生成とコマンドの実行 プロセス生成のシステムコール プロセス生成のシステムコール プロセス生成のプログラム例 プロセス生成のプログラム例 プログラム実行のシステムコール プログラム実行のシステムコール 子プロセスの終了を待つシステムコール 子プロセスの終了を待つシステムコール 簡単なシェルの仕様 簡単なシェルの仕様 簡単なシェルの作成 簡単なシェルの作成
プロセスの生成とコマンドの実行 プロセス生成のシステムコール fork 子プロセスを生成する インクルードファイル #include #include 書式 pid_t fork (void); 戻値成功時 親プロセス : 子プロセス ID 子プロセス : 0 失敗時 -1 説明子プロセスは、親プロセスの複製 戻値によってプロセスは親か子かを 判断する。 親プロセス pid=100 fork(); 戻値 102 子プロセス pid=102 fork(); 戻値 0 子プロセスの生成
プロセスの生成とコマンドの実行 プロセス生成のプログラム例 lv.c #include int main(int argc,char *argv[]) { int dep_time; dep_time=atoi(argv[1])*60-5; if (fork()==0) { // 子プロセスの生成 sleep(dep_time); fprint(stderr, " Leave in 5 sec\n " ); } return EXIT_SUCCESS; } % gcc lv.c –o lv %./lv 1 ( 1 分後に予定あ り) % % Leave in 5 sec ( 5 秒前にアラー ム)
プロセスの生成とコマンドの実行 プログラム実行のシステムコール execl プログラムをロードし 実行 インクルードファイル #include 書式 int execl(const char *path, const char *arg,..); 戻値成功時 なし 失敗時 -1 説明 execl の引く数で指定したプログラムが execl を呼出たプロセスを上書きする プロセス execl( " /bin/ls ", " /bin/ls ", " -l ", NULL); / bin ls usr
プロセスの生成とコマンドの実行 子プロセスの終了を待つシステムコール wait 子プロセスの終了を待つ インクルードファイル #include #include 書式 pid_t wait (int *status); 戻値成功時 子プロセス ID 失敗時 -1 親プロセス fork(); wait(); 子プロセス exit(); 子プロセスの生成 子プロセスの 終了を待つ
プロセスの生成とコマンドの実行 簡単なシェルの仕様 簡単なシェルの仕様 シェルとは、 (1) 文字列を入力する (2) 入力された文字列で示されるコマンド(プログラム)を 実行 (3) コマンドの実行が終ったら (1) へ シェルプログラムの動作 プロンプトを表示 標準入力がなくなるまで以下を繰返す (1) 親プロセス ( シェル)は、文字列を入力する (2) 子プロセスを生成する (3) 子プロセスは、入力された1行をコマンドとして実行 する (4) 親プロセスは、子プロセスの処理が終るのを待つ (5) 親プロセスは、再び、プロンプトを表示する (6) 親プロセスは、再び、標準入力から次の1行入力を待 つ
プロセスの生成とコマンドの実行 簡単なシェルの作成 簡単なシェルの作成 nsh. c #include int main() { char command[256],line[256]; int st; static char prompt[64]= " > " ; fprintf(stderr, " %s ",prompt); while (fgets(line,sizeof(line),stdin)!=NULL { if (sscanf(line, " %s ",command)>0) { if (fork()==0) { if (execl(command,command,NULL)<0) { exit(EXIT_Failure); } } else { wait(&st); } fprint(stderr, " %s ",prompt); } return EXIT_SUCCESS; } %./nsh > /bin/ls ファイル名一覧が表示される > ( Ctrl-D を押すと、もとのシェ ルに戻る) %