子プロセスの生成 子プロセスの 終了を待つ

Download Report

Transcript 子プロセスの生成 子プロセスの 終了を待つ

プロセスの生成とコマンドの実行
プロセスの生成とコマンドの実行






プロセス生成のシステムコール
プロセス生成のプログラム例
プログラム実行のシステムコール
子プロセスの終了を待つシステムコール
簡単なシェルの仕様
簡単なシェルの作成
プロセスの生成とコマンドの実行
プロセス生成のシステムコール
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;
}