システムプログラミング 第10回 情報工学科 篠埜 功. 今回の内容 プロセス(続き) – execve システムコール 現在のプロセスを、引数に与えられたファイル(実行 形式ファイルあるいはシェルスクリプト等の実行可能 なファイル)を受け取り、現在のプログラムをそれで 置き換える(変身)。 fork.

Slides:



Advertisements
Similar presentations
システムプログラミング 第11回 シグナル 情報工学科 篠埜 功. 今回の内容 前回の補足( exit システムコールについ て) プロセス間通信 – シグナルの送信 --- 今回の内容 – パイプによる通信 – ソケットによる通信.
Advertisements

システムプログラミング 情報工学科 篠埜 功 情報工学科 3 年生対象 専門科目 第5回 シェルスクリプトの続 き レポート課題 main 関数の引数 usage メッセージ.
ネットワーク・プログラミ ング カーネルの役割とプロセス生成. 1.1 OS の役割 仮想マシン OS はハードウェアの多様性 をカプセル化し、利用者を 複雑な処理から開放する。 プロセス管理 時間多重化により各プロセ スに CPU を割当てる。 メモリ管理 メモリ空間の多重化により、 各プロセスにメモリを割当.
プロセスの生成とコマンドの実行 プロセスの生成とコマンドの実行 プロセス生成のシステムコール プロセス生成のシステムコール プロセス生成のプログラム例 プロセス生成のプログラム例 プログラム実行のシステムコール プログラム実行のシステムコール 子プロセスの終了を待つシステムコール 子プロセスの終了を待つシステムコール.
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
システムプログラミング 第6回、7回 main関数の引数 usageメッセージ システムコールのエラーメッセージ ファイル
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
プログラミング入門2 第10回 動的な領域確保 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
第8回 プログラミングⅡ 第8回
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
アルゴリズムとデータ構造 補足資料6-3 「サンプルプログラムcat3.c」
担当:青木義満、篠埜 功 情報工学科 3年生対象 専門科目 システムプログラミング 第8回、第9回 シグナル処理 担当:青木義満、篠埜 功
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
システムプログラミング 第6回、7回、8回 情報工学科 篠埜 功.
システムプログラミング 第9回 、10回 ハードリンク、シンボリックリンク プロセスの生成
システムプログラミング 第12回 プロセス間通信 情報工学科 篠埜 功.
マルチスレッド処理 マルチプロセス処理について
プログラミング 4 記憶の割り付け.
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
システムプログラミング 第3回、第4回、第5回、第6回 情報工学科 篠埜 功 makeコマンド 動的リンクライブラリ シェルスクリプト
プログラミング入門2 第11回 情報工学科 篠埜 功.
演習1の解答例の解説 2004年10月21日 海谷 治彦.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
演習1の解答例の解説 2006年11月8日 海谷 治彦.
プログラミング入門 第12回 情報工学科 篠埜 功.
プログラミング入門 第12回 情報工学科 篠埜 功.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第6回 システムプログラミング概要 プロセスの生成 担当:青木義満
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
情報工学科 3年生対象 専門科目 システムプログラミング 第4回 シェルスクリプト 情報工学科 篠埜 功.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
システムプログラミング 第12回 プロセス間通信 情報工学科 篠埜 功.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
プログラミング入門2 第13回、14回 総合演習 情報工学科 篠埜 功.
システムプログラミング 第6回 システムコールのエラーメッセージ ファイルシステム 情報工学科 篠埜 功.
システムプログラミング 第12回 プロセス間通信 情報工学科 篠埜 功.
ネットワーク・プログラミング デバイスドライバと環境変数.
システムプログラミング 第10回 プロセス間通信3 簡易Web server(準備) Chat プログラム 担当:青木義満、篠埜 功
高度プログラミング演習 (11).
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
システムプログラミング 第9回 、10回 ハードリンク、シンボリックリンク プロセスの生成
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
情報工学科 3年生対象 専門科目 システムプログラミング 第3回 makeコマンド 動的リンクライブラリ 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
情報工学科 3年生対象 専門科目 システムプログラミング 第3回 makeコマンド 動的リンクライブラリ 情報工学科 篠埜 功.
ネットワーク・プログラミング 1対多のプロセス間通信.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
情報処理Ⅱ 2005年11月25日(金).
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
Presentation transcript:

システムプログラミング 第10回 情報工学科 篠埜 功

今回の内容 プロセス(続き) – execve システムコール 現在のプロセスを、引数に与えられたファイル(実行 形式ファイルあるいはシェルスクリプト等の実行可能 なファイル)を受け取り、現在のプログラムをそれで 置き換える(変身)。 fork システムコールによって子プロセスの生成後、子プ ロセスが execve システムコールによって新しいプログ ラムを読み込むというのが典型的な使い方 (fork-exec) 。 execve システムコールを使って定義されたいくつかの ライブラリ関数があり、自分の使い方あった、便利が よい関数を用いればよい。以下ではこれらをまとめて exec システムコールと呼ぶこととする。

3 実行形式ファイルに格 納されているプログラ ムを別プロセスで実行 したい場合は、 fork で 子プロセスを作り、子 プロセスで exec システ ムコールを用いる。こ れを fork-exec という。

例(打ち込んで確認) 子プロセスで ps コマ ンドを実行する例 #include int main (void) { int pid, status; char * argv [2] = {"/bin/ps", NULL}; if ((pid = fork()) == 0) { execv("/bin/ps", argv); } else if (pid >= 1) { wait (&status); } else { perror ("fork"); exit(1); } exit (0); }

wait システムコール 子プロセス生成後,親プロセスは wait() を呼んで子 プロセスの終了を待つ。 子プロセスが終了すると、 wait システムコールによ り、子プロセス用のプロセステーブルのエントリ、 プロセス ID が消され、それらが再利用可能な状態 になる。 子プロセスが終了した後、親プロセスが wait システ ムコールを呼ばなかった場合は、子プロセスはゾ ンビ状態となる。親プロセスが終了したら init プロ セスが親になり、 init プロセスが wait システムコー ルを呼び出す(のでゾンビ状態ではなくなり、プ ロセスが終了する)。 子プロセスの終了ステータス情報を得るため,引 数に int 型へのポインタを渡す。

ゾンビプロセス(打ち込んで確 認) #include int main (void) { int pid; int status; if ((pid = fork()) == 0) { } else if (pid >= 1) { sleep (5); wait (&status); } else { perror ("fork"); exit(1); } exit (0); } このプログラムを実行し、 5 秒以内に Ctrl-z で suspend す る。そのときに ps コマンド を実行すると、以下のよう に、 と書かれたプ ロセスがあるはずである。 これがゾンビプロセスであ る。 pts/0 00:00:00 a.out pts/0 00:00:00 a.out

例:コマンドの引数に与えられた プログラムを実行(打ち込んで確 認) #include int main (int argc, char * argv []) { if (argc < 2) { fprintf (stderr, "Usage: %s command [option]\n", argv[0]); exit(1); } if (execv (argv[1], &argv[1]) == -1) { perror ("execv"); exit(1); } return 0; /* ここには来ない */ } $./a.out /bin/ps –ef のようにして実行する。 この場合、 $ /bin/ps –ef と打ったのと同じ結果 が表示される。

簡易 shell (打ち込んで確認) #include #define ARG_NUMBER 16 #define PARAM_SIZE 128 int getcomln (char * argvline[]) { int i,j,k; char linebuf [ARG_NUMBER * PARAM_SIZE]; for (i=0; (linebuf [i] = getchar()) != EOF; i++) { if (linebuf[i] == '\n') { linebuf[i] = '\0'; break; } if (linebuf[i] == EOF) return EOF; for (i=j=k=0; (argvline[i][j] = linebuf[k]) != '\0'; j++, k++) { switch (argvline[i][j]) { case ' ': if (j>0) { argvline[i][j] = '\0'; i++; } j=-1; } argvline[i][j] = '\0'; if (i==0 && j==0) return 0; else return i+1; }

簡易 shell の続き int main (void) { int argcline, i, pid, status; char * argvline [ARG_NUMBER]; char line [ARG_NUMBER] [PARAM_SIZE]; for (i=0; i<ARG_NUMBER; i++) argvline[i] = line[i]; while (printf ("> "), (argcline = getcomln (argvline)) != EOF) { if (argcline == 0) continue; if ((pid = fork()) == 0) { argvline [argcline] = NULL; if (execvp (argvline[0], argvline) == -1) { perror ("execvp"); exit(1); } else if (pid >= 1) wait (&status); else { perror ("fork"); exit(1); } putchar ('\n'); exit(0); }

演習課題 tcsh 等のシェルで exit と打つとシェルが終了する。 exit はシェルの内部コマンドである。 さきほどの簡易シェルに、 exit (シェルの内部コマ ンド)を追加せよ。配列 argvline の最初の要素が exit という文字列を指しているかどうかで判定すれば よい。 文字列の比較には strcmp を用いよ。使い方は man strcmp で調べればよい。 tcsh 等のシェルの exit コマンドは引数を取ることが でき、それによって終了 status を指定できるが、こ の課題では終了 status は気にしないこととする。 exit によってシェル自体を終了させるので、シェル の内部コマンドとして実装するのが自然である。

cd cd コマンドは shell の内部コマンドである。 cd コマンドによって、 shell 自体のディレクト リが変更されなければならないので、 cd は外 部コマンドとしては実装できない。 cd コマンドが入力されたときは、 shell 本体に おいて、 chdir システムコールを呼び出す。 配列 argvline の最初の要素が cd という文字列を 指しているかどうかで cd コマンドかどうかの 判定をすればよい。 chdir の使い方は、 $ man –s2 chdir で確認。

レポート課題4 さきほどの簡易 shell に、 cd コマンドをシェルの 内部コマンドとして追加せよ。 引数無しの場合はホームディレクトリに移動。 引数1つの場合は、その引数で指定されたディ レクトリへ移動。 それ以外の場合は、 cd コマンドの使い方を表示 (メッセージは、 tcsh などにおける cd の使い方 の表示を参考にして、自分で適当に作成)。 ディレクトリ移動後は、他の通常のコマンドと 同様、プロンプト表示に戻る。

レポートの提出方法 □ 下記のファイルを作成し、提出 kadai4.c, kadai4.txt □ 提出方法 システムプログラミング講義用の課題提出用フォルダ 内にある kadai4 というフォルダの中に自分の学籍番号 を名前とするフォルダを作成し、その中に上記ファイ ルを置く。 kadai4.txt 内に学籍番号、氏名、日付、およ び作成したプログラムの簡単な説明を記載する。 □ 提出期限 12 月 22 日の講義開始時間まで。締め切り後に提出した 場合、成績への反映を保証しない。

補足 ホームディレクトリは、 getenv ライブラリ関 数で取得できる。 getenv(“HOME”) の返り値として、 ”/home/sit/sasano”( 私の場合 ) のような文字列( char へのポインタ型)が得 られる。 cd コマンドで引数がない場合は、それを chdir の引数に与えれればよい。 (レポート課題としては、ホームディレクト リの文字列を直書きでも OK とする。)