担当:青木義満、篠埜 功 yaoki@sic.shibaura-it.ac.jp sasano@sic.shibaura-it.ac.jp 情報工学科 3年生対象 専門科目 システムプログラミング 第8回、第9回 シグナル処理 担当:青木義満、篠埜 功 yaoki@sic.shibaura-it.ac.jp.

Slides:



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

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

担当:青木義満、篠埜 功 yaoki@sic.shibaura-it.ac.jp sasano@sic.shibaura-it.ac.jp 情報工学科 3年生対象 専門科目 システムプログラミング 第8回、第9回 シグナル処理 担当:青木義満、篠埜 功 yaoki@sic.shibaura-it.ac.jp sasano@sic.shibaura-it.ac.jp

講義用web page等 講義用web page http://www.sic.shibaura-it.ac.jp/~sasano/lecture/lecture.html メールアドレス sasano@sic.shibaura-it.ac.jp

シグナルとは? プロセス,カーネル,ユーザが(カーネルを通して)ある事象の発生をプロセスに知らせる働き プロセスに対する割り込み(ソフトウェア割り込み) プロセス内外から様々な状況をプロセスに非同期に伝えることが可能 約30種類のタイプ

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

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

Signalシステムコール使用例1 Ctrl-Cが押されたら一度はそれを捕獲し、 2回目は終了するプログラム

#include <signal.h>  /* signalの宣言 SIGINT, SIG_DFLのマクロ定義 */ #include <stdio.h> /* printfの宣言 */ #include <unistd.h> /* sleepの宣言 */ void f (int sig) { printf("I got signal %d\n", sig); signal(SIGINT, SIG_DFL); } int main() signal(SIGINT, f); while(1) { printf("Hello World!\n"); sleep(1);

Signalシステムコール使用例2 「割り込み文字が入力されたら画面にメッセージを出力,15秒後に終了するプログラム」 配布プリント:setsigint.c

システムコール使用例3 以前のparent.c 改良 親プロセスは子プロセスの終了をwait()システムコールでひたすら待つ処理形式,その間は仕事できない 改良 子プロセスの終了を待たず,子プロセスが終了したことをシグナルで受け取り,wait()システムコールを呼ぶ形式, SIGCHLDを利用 親も他の仕事ができるようになる! 配布プリント: parent_sig.c

前回の補足説明 前回のparent_sig.cで、子プロセスは3つ生成 されるが、execlの呼出しで、childA, childB, childCが実行される。execlシステムコールは、 エラーになった場合以外は戻らずに、プロセスが終了する(execlシステムコール内の最初の エラー処理部分を通過した後、プロセスの中身が置き換わるため、戻るのは不可能となる。呼び出されたコマンドが終了したらそのプロセスは終了。) forkシステムコールは3か所で呼ばれているが、すべて 最初のプロセス(main関数が実行されているプロセス)が呼び出している。

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

シグナルについて注意事項 シグナルの実装 プロセス制御ブロック(各プロセスごとにあり、メモリに常駐。 UNIX系OSではプロセス構造体)の中の、シグナル情報を 保持する部分への書き込み。 定期的(プロセスの切り替え時等)に、プロセス制御 ブロック中のシグナルの情報がチェックされる。 シグナルを書き込む場所は各プロセスにつき一か所で、 1つのシグナルが未処理の状態で次のシグナルがきたら 前のシグナル(SIGKILL以外の場合)は上書きされて消える。

割り込みとシグナルのまとめ 割り込み(ハードウェア割り込み) CPUの命令実行への割り込み 外部割り込み(CPUの外部で発生。) 割り込みを人為的に発生させる。 その他、浮動小数点エラー、電源異常等 メモリの先頭領域など、CPUであらかじめ定められた 場所に各割り込みに対する処理(のアドレス)を記述 シグナル(ソフトウェア割り込み) プロセスへの割り込み。プロセス制御ブロックの書き換えで実現する。(killシステムコールで書き換える。) (参考) シグナルハンドラ(のアドレス)はUNIXではユーザ構造体に保持する。(signalシステムコールで変更可。)

タイマー処理 シグナルのタイマーとしての利用 一定時間後に何らかの処理をしたい場合 例)一時間後に他のユーザにメッセージを送りたい シグナル:SIGALRM システムコール:alarm(), pause() を利用

alarm()とpause()

タイマー処理(alarm) 例1 setalarm.c プロセス内部にタイマーを設定 alarm()により,時間経過を表示 実行方法(引数の単位はsec)  ./setalarm 10

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

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

処理例 2 sendsigint.c (以前のprogexef.cを変更) 親から子プロセスへシグナルを発信 処理例 2 sendsigint.c (以前のprogexef.cを変更) 親から子プロセスへシグナルを発信 子プロセスはシグナルを受け取り,シグナルハンドラを実行 実行方法 ./sendsigint setsigint 子プロセス

練習問題1 最初の例を拡張し、Ctrl-Cが3回押されたら終了するプログラムを書け。

練習問題2 Ctrl-Cを押したら、それが何回目かを表示 するプログラムを書け。 (プログラム内にsleepを無限に繰り返すループを入れる。Global変数にCtrl-Cが押された回数を保持する。)

練習問題3 自分がログインしているマシンの(自分のユーザIDの)プロセスのプロセス番号を列挙するプログラムを書け。 kill(pid, 0)を用いる。 pidを1から32767まで変化させる。 (注意) 自分のユーザIDのプロセス以外に送った場合、エラーになる。 kill(pid, 0)が正常終了した場合(返り値が0の場合)のpidは自分の ユーザIDのプロセスIDである。