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

Slides:



Advertisements
Similar presentations
システムプログラミング 情報工学科 篠埜 功 情報工学科 3 年生対象 専門科目 第5回 シェルスクリプトの続 き レポート課題 main 関数の引数 usage メッセージ.
Advertisements

ネットワーク・プログラミ ング カーネルの役割とプロセス生成. 1.1 OS の役割 仮想マシン OS はハードウェアの多様性 をカプセル化し、利用者を 複雑な処理から開放する。 プロセス管理 時間多重化により各プロセ スに CPU を割当てる。 メモリ管理 メモリ空間の多重化により、 各プロセスにメモリを割当.
プロセスの生成とコマンドの実行 プロセスの生成とコマンドの実行 プロセス生成のシステムコール プロセス生成のシステムコール プロセス生成のプログラム例 プロセス生成のプログラム例 プログラム実行のシステムコール プログラム実行のシステムコール 子プロセスの終了を待つシステムコール 子プロセスの終了を待つシステムコール.
システムプログラミング 第10回 情報工学科 篠埜 功. 今回の内容 プロセス(続き) – execve システムコール 現在のプロセスを、引数に与えられたファイル(実行 形式ファイルあるいはシェルスクリプト等の実行可能 なファイル)を受け取り、現在のプログラムをそれで 置き換える(変身)。 fork.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
システムプログラミング 第6回、7回 main関数の引数 usageメッセージ システムコールのエラーメッセージ ファイル
プログラミング入門2 第10回 動的な領域確保 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
ネットワークプログラミング 第9回「応用ネットワークプログラミング(1)」
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
第8回ネットワークプログラミング 中村 修.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
第6章 2重ループ&配列 2重ループと配列をやります.
担当:青木義満、篠埜 功 情報工学科 3年生対象 専門科目 システムプログラミング 第8回、第9回 シグナル処理 担当:青木義満、篠埜 功
第3回 CPUの管理と例外処理 OSによるハードウェアの管理 CPUの構成、動作 CPUの管理 例外処理、割り込み処理 コンテキストスイッチ
Linuxカーネルについて 2014/01.
割り込み.
割り込み.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
シグナル通信 普通の割込みとソフトウェア割込み ソフトウェア割込みとシグナル キーボードからのシグナル 例外 (exception)
プログラミング入門2 第2回 複合文、繰り返し 情報工学科 篠埜 功.
第7回 条件による繰り返し.
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング2 関数
システムプログラミング 第9回 、10回 ハードリンク、シンボリックリンク プロセスの生成
システムプログラミング 第12回 プロセス間通信 情報工学科 篠埜 功.
関数の定義.
マルチスレッド処理 マルチプロセス処理について
プログラミング入門2 第8回 ポインタ 情報工学科 篠埜 功.
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 条件による繰り返し.
プログラミング入門2 第11回 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第6回 システムプログラミング概要 プロセスの生成 担当:青木義満
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
情報工学科 3年生対象 専門科目 システムプログラミング 第4回 シェルスクリプト 情報工学科 篠埜 功.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
C言語 はじめに 2016年 吉田研究室.
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
システムプログラミング 第12回 プロセス間通信 情報工学科 篠埜 功.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
システムプログラミング 第6回 システムコールのエラーメッセージ ファイルシステム 情報工学科 篠埜 功.
システムプログラミング 第12回 プロセス間通信 情報工学科 篠埜 功.
ネットワーク・プログラミング デバイスドライバと環境変数.
ネットワーク・プログラミング Cプログラミングの基礎.
第5回 プログラミングⅡ 第5回
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
システムプログラミング 第9回 、10回 ハードリンク、シンボリックリンク プロセスの生成
情報工学科 3年生対象 専門科目 システムプログラミング 第3回 makeコマンド 動的リンクライブラリ 情報工学科 篠埜 功.
情報工学科 3年生対象 専門科目 システムプログラミング 第3回 makeコマンド 動的リンクライブラリ 情報工学科 篠埜 功.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
ネットワーク・プログラミング パイプライン通信とシグナル.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
ネットワーク・プログラミング マルチタスク.
プログラミング入門2 第5回 配列 変数宣言、初期化について
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
第1章 文字の表示と計算 printfと演算子をやります.
プログラミング 2 静的変数.
Presentation transcript:

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

今回の内容 前回の補足( exit システムコールについ て) プロセス間通信 – シグナルの送信 --- 今回の内容 – パイプによる通信 – ソケットによる通信

前回の補足 exit システムコール – exit システムコールは、 exit システムコールを呼び 出したプロセスを終了させ、ゾンビ状態にする。 – 引数に受け取った数を終了 status とし、 wait シス テムコールの引数( int 型へのポインタが渡され る)にその情報が格納される。 – ゾンビ状態のプロセスは、そのプロセスの親プロ セスが wait システムコールを呼ぶことにより消滅 する。 – 通常は親プロセスが wait システムコールを呼んで いるので、瞬時にゾンビ状態は消滅する。

4 シグナルとは? ある事象の発生をプロセスに知らせる働 き プロセスに対する割り込みと見ることが できる(ソフトウェア割り込み) 約 30 種類ある。

5

6 シグナルとは #include int main () { int i; for (i=0;;i++) { sleep (1); printf ("hello %d\n",i); } return 0; } これをコンパイル、実行し、 Ctrl_C (終了) Ctrl_Z (一時停止) fg (再開) などを入力してみる。 また、 ps –ef でこのプログラ ム実行中にプロセス番号を調 べ、 $ kill -STOP プロセス番号 $ kill -CONT プロセス番号 $ kill –INT プロセス番号 を試す。 ( terminal を2つ開くとやり やすい)

7 シグナル捕獲時の処理の指定 signal() システムコール シグナル番号: シグナルの種類 シグナルハンドラ関数: シグナルを捕獲した際に実行する関数

8 Ctrl-C が押されたら一度 はそれを捕獲し、2 回目は終了するプロ グラム #include /* signal の宣言 SIGINT, SIG_DFL のマクロ定義 */ #include /* printf の宣言 */ #include /* sleep の宣言 */ #include /* exit の宣言 */ void f (int sig) { printf(“signal %d\n", sig); signal(SIGINT, SIG_DFL); } int main() { if (signal (SIGINT, f) == SIG_ERR) { perror ("signal"); exit(1); } while(1) { printf("Hello World!\n"); sleep(1); } SIGINT ( 2 番)は SIGnal INTerrupt 。

9 Signal システムコール使用例2(打ち込んで確 認) #include void f (int sig) { printf ("signal %d is caught.\n", sig); exit (1); } int main(void) { int x; if (signal (SIGFPE, f) == SIG_ERR) { perror ("signal"); exit(1); } printf ("1/0 = %d\n", 1/0); return 0; } 0 での除算があったら メッセージを表示して 終了するプログラム 1/0 が実行された時、 CPU から kernel へ通知が行き、 kernel から このプログラムのプロセスにシ グナル SIGFPE(8 番 ) が送られる。 SIGFPE は名前は浮動小数点例外 だが、浮動小数点以外の演算で も発生する。 SIGFPE は SIGnal Floating Point Exception 。

10 Signal システムコール使用例3(打ち込んで確 認) #include void f (int sig) { printf ("signal %d is caught.\n", sig); exit (1); } セグメントエラーが あったらメッセージを 表示して終了する。 *p が評価されたとき、 CPU か ら kernel へ通知が行き、 kernel からこのプログラムのプロセ スにシグナル SIGSEGV ( 11 番) が送られる (p が null ポインタな ので)。 SIGSEGV は SIGnal SEGmentation Violation 。 /* 続き */ int main(void) { int *p=NULL; int x; if (signal (SIGSEGV, f) == SIG_ERR) { perror ("signal"); exit(1); } x = *p; return 0; }

11 SIGCHLD シグナル 前回紹介した fork するだけのプログラム – 親プロセスは子プロセスの終了を wait() システ ムコールでひたすら待つ処理形式,その間は 他の仕事はできない。 今回紹介する親プロセスのプログラム – 子プロセスの終了を待たず,子プロセスが終 了したことをシグナル (SIGCHLD) で受け取り, シグナル処理関数内で wait() システムコールを 呼ぶ。待ち時間がない。(子プロセスが終了 したとき、 SIGCHLD シグナルが親プロセスに送 られる。) – 親も他の仕事ができるようになる。

#include void sigpwait (int sig) { int status; printf ("Parent process: child process has just finished.\n"); wait (&status); exit(1); } int main (void) { int pid; if (signal(SIGCHLD, sigpwait) == SIG_ERR) { perror ("signal"); exit(1); } if ((pid = fork()) == 0) { printf ("Child process. ”); printf (“sleep for 2 seconds.\n"); sleep(2); } else if (pid >= 1) { printf ("Parent process. ”); printf (“infinite loop.\n"); while (1); } else { perror ("fork"); exit(1); } exit (0); } Signal システムコール使用例4(打ち込んで確 認)

13 シグナルについて補足 signal システムコールで各シグナルに対する処理 を変更できるが、 SIGKILL(9) と SIGSTOP(19) に対す る処理だけは変更できない。 SIGKILL --- プロセスの終了 SIGSTOP --- プロセスの一時停止 スーパユーザ (root) が任意のプロセスを終了させたり一 時停止させたりすることが必ずできるようにするため。

14 シグナルの実装 プロセス制御ブロック ( 各プロセスごとにあり、メモリに常駐。 UNIX 系 OS ではプロセス構造体 ) の中の、シグナル情報を 保持する部分への書き込み。 定期的(プロセスの切り替え時等)に、プロセス制御 ブロック中のシグナルの情報がチェックされる。

15 割り込みとシグナルのまとめ 割り込み(ハードウェア割り込み) CPU の命令実行への割り込み 外部割り込み (CPU の外部で発生。 ) --- CPU の信号線への入力。キーボード入力、電源異常等。 内部割り込み (CPU 内部で発生 ) トラップ命令 --- CPU の命令の1つ。 割り込みを人為的に発生させる。 その他、オーバーフロー、ページフォールト、特権命令 違反等 メモリの先頭領域など、 CPU であらかじめ定められた 場所に各割り込みに対する処理(のアドレス)を記述 シグナル(ソフトウェア割り込み) プロセスへの割り込み。プロセス制御ブロックの書き換えで 実現する。 (kill システムコールで書き換える。 )

16 プロセスへのシグナル送信 kill システムコールを用いる。

17 プロセスへのシグナル送信 kill システムコールの注意点 kill システムコールの送信プロセスのユーザ ID は 受信プロセスのユーザ ID と一致しなければならない。 ただし、送信プロセスのユーザ ID がスーパーユーザの場合 は 一致しなくてよい。 init プロセス(プロセス ID 1 番)にはシグナルハンドラが設 定されていない。(間違ってシステムを停止させないよう にするため)

18 練習問題1 Ctrl-C を押したら、それが何回目かを表示 するプログラムを書け。 (プログラム本体は何もしない無限ループを 実行する。シグナル捕獲関数を signal システム コールで SIGINT ( 2 番、 SIGnal INTerrupt )に対 して設定する。 Global 変数に Ctrl-C が押された 回数を保持する。) (終了方法) Ctrl-Z で中断し、 ps コマンドで process id を調べ、 kill コマンドで引数にその id を与えて終了させる。

19 練習問題2 自分がログインしているマシンの(自分 のユーザ ID の)プロセスのプロセス番号 を列挙するプログラムを書け。 kill(pid, 0) を用いる。(第2引数が 0 の場 合はシグナルは送られず、エラーチェッ クが行われる。 pid が自分のプロセスの ID の場合返り値が 0 であり、それ以外の場合 は、存在しない ID か、あるいは自分以外 のプロセスということで返り値が -1 にな る。 ) pid を 1 から まで変化させる。