プロセスの生成とコマンドの実行 プロセスの生成とコマンドの実行 プロセス生成のシステムコール プロセス生成のプログラム例 プログラム実行のシステムコール 子プロセスの終了を待つシステムコール 簡単なシェルの仕様 簡単なシェルの作成 プロセスの生成とコマンドの実行 プロセス生成のシステムコール fork 子プロセスを生成する 親プロセス pid=100 子プロセス pid=102 子プロセスの生成 fork(); fork(); 戻値 102 戻値 0 インクルードファイル #include <sys/types.h> #include <unistd.h> 書式 pid_t fork (void); 戻値 成功時 親プロセス: 子プロセスID 子プロセス: 0 失敗時 -1 説明 子プロセスは、親プロセスの複製 戻値によってプロセスは親か子かを 判断する。 プロセスの生成とコマンドの実行 プロセス生成のプログラム例 #include <stdio.h> #include <stdlib.h> #include <unistd.h> lv.c % gcc lv.c –o lv % ./lv 1 % % Leave in 5 sec (1分後に予定あり) (5秒前にアラーム) 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; } プロセスの生成とコマンドの実行 プログラム実行のシステムコール execl インクルードファイル #include <unistd.h> 書式 int execl(const char *path, const char *arg, ..); 戻値 成功時 なし 失敗時 -1 説明 execlの引く数で指定したプログラムが execlを呼出たプロセスを上書きする プログラムをロードし実行 プロセス execl("/bin/ls", "/bin/ls", "-l", NULL); / bin ls usr プロセスの生成とコマンドの実行 子プロセスの終了を待つシステムコール wait 子プロセスの終了を待つ 子プロセス 親プロセス fork(); wait(); 子プロセスの 終了を待つ インクルードファイル #include <sys/types.h> #include <sys/wait.h> 書式 pid_t wait (int *status); 戻値 成功時 子プロセスID 失敗時 -1 子プロセスの生成 exit(); プロセスの生成とコマンドの実行 簡単なシェルの仕様 シェルとは、 (1) 文字列を入力する (2) 入力された文字列で示されるコマンド(プログラム)を実行 (3) コマンドの実行が終ったら(1)へ シェルプログラムの動作 プロンプトを表示 標準入力がなくなるまで以下を繰返す (1) 親プロセス(シェル)は、文字列を入力する (2) 子プロセスを生成する (3) 子プロセスは、入力された1行をコマンドとして実行する (4) 親プロセスは、子プロセスの処理が終るのを待つ (5) 親プロセスは、再び、プロンプトを表示する (6) 親プロセスは、再び、標準入力から次の1行入力を待つ プロセスの生成とコマンドの実行 簡単なシェルの作成 nsh.c % ./nsh #include <stdio.h> > /bin/ls #include <stdlib.h> ファイル名一覧が表示される #include <unistd.h> > (Ctrl-Dを押すと、もとのシェルに 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; }
© Copyright 2024 ExpyDoc