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

Slides:



Advertisements
Similar presentations
システムプログラミング 第11回 シグナル 情報工学科 篠埜 功. 今回の内容 前回の補足( exit システムコールについ て) プロセス間通信 – シグナルの送信 --- 今回の内容 – パイプによる通信 – ソケットによる通信.
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回 構造体 情報工学科 篠埜 功.
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
ネットワークプログラミング 第9回「応用ネットワークプログラミング(1)」
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
第8回ネットワークプログラミング 中村 修.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
担当:青木義満、篠埜 功 情報工学科 3年生対象 専門科目 システムプログラミング 第8回、第9回 シグナル処理 担当:青木義満、篠埜 功
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回 プロセス間通信 情報工学科 篠埜 功.
関数の定義.
マルチスレッド処理 マルチプロセス処理について
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
プログラミング入門2 第8回 ポインタ 情報工学科 篠埜 功.
知能情報工学演習I 第12回(後半第6回) 課題の回答
プログラミング入門2 第11回 情報工学科 篠埜 功.
演習1の解答例の解説 2004年10月21日 海谷 治彦.
第7回 条件による繰り返し.
プログラミング入門2 第11回 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
プログラミング論 ファイル入出力
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第6回 システムプログラミング概要 プロセスの生成 担当:青木義満
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
情報工学科 3年生対象 専門科目 システムプログラミング 第4回 シェルスクリプト 情報工学科 篠埜 功.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
システムプログラミング 第12回 プロセス間通信 情報工学科 篠埜 功.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
システムプログラミング 第6回 システムコールのエラーメッセージ ファイルシステム 情報工学科 篠埜 功.
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
システムプログラミング 第12回 プロセス間通信 情報工学科 篠埜 功.
ネットワーク・プログラミング デバイスドライバと環境変数.
第5回 プログラミングⅡ 第5回
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
システムプログラミング 第9回 、10回 ハードリンク、シンボリックリンク プロセスの生成
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
ネットワーク・プログラミング パイプライン通信とシグナル.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
ネットワーク・プログラミング マルチタスク.
プログラミング入門2 第5回 配列 変数宣言、初期化について
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
第1章 文字の表示と計算 printfと演算子をやります.
= 55 課題6-1 #define _CRT_SECURE_NO_WARNINGS
プログラミング 2 静的変数.
Presentation transcript:

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

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

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

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

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

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

Signalシステムコール使用例1(打ち込んで確認) #include <signal.h>  /* signalの宣言 SIGINT, SIG_DFLのマクロ定義 */ #include <stdio.h> /* printfの宣言 */ #include <unistd.h> /* sleepの宣言 */ void f (int sig) { printf(“signal %d\n", sig); signal(SIGINT, SIG_DFL); } int main() signal (SIGINT, f); while(1) { printf("Hello World!\n"); sleep(1); Ctrl-Cが押されたら一度はそれを捕獲し、2回目は終了するプログラム

Signalシステムコール使用例2(打ち込んで確認) #include <signal.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> void f (int sig) { printf ("signal %d is caught.\n", sig); exit (1); } int main(void) int x; signal (SIGFPE, f); printf ("1/0 = %d\n", 1/0); return 0; 0での除算があったらメッセージを表示して終了するプログラム

Signalシステムコール使用例3(打ち込んで確認) #include <signal.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> void f (int sig) { printf ("signal %d is caught.\n", sig); exit (1); } int main(void) int * p = NULL; signal (SIGSEGV, f); *p = 3; return 0; セグメントエラーがあったらメッセージを表示して終了するプログラム

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

Signalシステムコール使用例4(打ち込んで確認) #include <unistd.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> 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"); 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システムコールで各シグナルに対する処理を変更できるが、SIGKILL(9)とSIGSTOP(19)に対する処理だけは変更できない。 SIGKILL --- プロセスの終了 SIGSTOP --- プロセスの一時停止 スーパユーザ(root)が任意のプロセスを終了させたり一時停止させたりすることが必ずできるようにするため。

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

割り込みとシグナルのまとめ 割り込み(ハードウェア割り込み) CPUの命令実行への割り込み 外部割り込み(CPUの外部で発生。) 割り込みを人為的に発生させる。 その他、オーバーフロー、ページフォールト、特権命令違反等 メモリの先頭領域など、CPUであらかじめ定められた 場所に各割り込みに対する処理(のアドレス)を記述 シグナル(ソフトウェア割り込み) プロセスへの割り込み。プロセス制御ブロックの書き換えで 実現する。(killシステムコールで書き換える。) (参考) シグナルハンドラ(のアドレス)は(linux以外の)UNIXではユーザ構造体に保持する。Linuxにはユーザ構造体はなく、プロセス構造体のみ。

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

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

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

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