シグナル通信 普通の割込みとソフトウェア割込み ソフトウェア割込みとシグナル キーボードからのシグナル 例外 (exception)

Slides:



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

ネットワーク・プログラミ ング カーネルの役割とプロセス生成. 1.1 OS の役割 仮想マシン OS はハードウェアの多様性 をカプセル化し、利用者を 複雑な処理から開放する。 プロセス管理 時間多重化により各プロセ スに CPU を割当てる。 メモリ管理 メモリ空間の多重化により、 各プロセスにメモリを割当.
プロセスの生成とコマンドの実行 プロセスの生成とコマンドの実行 プロセス生成のシステムコール プロセス生成のシステムコール プロセス生成のプログラム例 プロセス生成のプログラム例 プログラム実行のシステムコール プログラム実行のシステムコール 子プロセスの終了を待つシステムコール 子プロセスの終了を待つシステムコール.
イベント イベント: マウスの操作、キーボードの操作、ファイル操作など システムやユーザーからの入力・出力のこと
システムソフトウェア講義の概要 計算機システムの復習:中央演算処理装置(CPU),プログラムの実行,主記憶装置,補助記憶装置
コンパイラ 2011年11月14日
Advanced Unix Commands
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
第8回ネットワークプログラミング 中村 修.
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
2006年度 計算機システム演習 第4回 2005年5月19日.
侵入検知システム(IDS) 停止 IDS サーバへの不正アクセスが増加している
第8回 プログラミングⅡ 第8回
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
担当:青木義満、篠埜 功 情報工学科 3年生対象 専門科目 システムプログラミング 第8回、第9回 シグナル処理 担当:青木義満、篠埜 功
第3回 CPUの管理と例外処理 OSによるハードウェアの管理 CPUの構成、動作 CPUの管理 例外処理、割り込み処理 コンテキストスイッチ
オペレーティングシステム (割り込み処理)
Linuxカーネルについて 2014/01.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
第5回 CPUの役割と仕組み3 割り込み、パイプライン、並列処理
割 込 み(1) オペレーティングシステム No.5.
第17回カーネル読書会 2001年10月17日 高杉@YLUG YLUG読書会
オペレーティングシステム i386アーキテクチャ(2)
割り込み.
割り込み.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
CONCURRENT PROGRAMMING
Linux リテラシ2006 第6回 デーモン CIS RAT.
第9回 プロセスの協調と排他制御 並行プロセスと資源の競合 競合問題 セマフォ 不可分命令の実装 プロセス間通信 PV命令
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
イベント通知機構・メモリ保護API.
プログラミング2 関数
独習Java ・ 8.1  例外処理 ・ 8.2  catch ブロックの検索  12月 5日    小笠原 一恵.
関数の定義.
マルチスレッド処理 マルチプロセス処理について
Cプログラミング演習 第7回 メモリ内でのデータの配置.
OSの仕組みとその機能 1E16M001-1 秋田 梨紗 1E16M010-2 梅山 桃香 1E16M013-3 大津 智紗子
Linux Device Driver 輪講 7. 時の流れ
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
オペレーティングシステム 第2回 割り込みとOSの構成
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第6回 システムプログラミング概要 プロセスの生成 担当:青木義満
プログラミング入門第6回 ~レゴロボットのプログラミング6~
情報処理 タイマの基礎 R8C タイマの基礎.
計算機工学III オペレーティングシステム #4 並行プロセス:排他制御基礎 2006/04/28 津邑 公暁
ネットワーク・プログラミング ソケットオプションとスレッド.
オペレーティングシステムJ/K 2004年11月15日2時限目
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
組込みシステムとは コンピュータ制御システム?
プログラミング 3 2 次元配列.
実装について 前田俊行.
システムプログラミング 第6回 システムコールのエラーメッセージ ファイルシステム 情報工学科 篠埜 功.
ネットワーク・プログラミング デバイスドライバと環境変数.
第5回 プログラミングⅡ 第5回
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
ネットワーク・プログラミング 非同期I/Oとスレッド同期制御.
ネットワーク・プログラミング TCPサーバ.
ネットワーク・プログラミング メッセージの作成とセマフォ.
ネットワーク・プログラミング ソケットプログラミングと共有メモリ.
ネットワーク・プログラミング 1対多のプロセス間通信.
ネットワーク・プログラミング パイプライン通信とシグナル.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
ネットワーク・プログラミング プロセスとファイルシステム管理.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
プログラミング 2 静的変数.
Presentation transcript:

シグナル通信 普通の割込みとソフトウェア割込み ソフトウェア割込みとシグナル キーボードからのシグナル 例外 (exception) キーボードからのシグナルの応用 シグナルの種類 ソフトウェア割込み(シグナル)の利用法 signalシステム・コール signalプログラミング シグナルalarmプログラミング シグナルkillプログラミング

Ctrl-C 普通の割込みとソフトウェア割込み 普通の割込み(ハードウェアによる割込み)は、オペレーティング・システム のカーネルにおいて利用されている。 ソフトウェア割込みとは、本来はオペレーティング・システムのカーネルしか 使えない割込みの機能を、ソフトウェアにより実現して、一般の利用者プログ ラム(プロセス)でも使えるようにしたものである。 Ctrl-C プロセス A プロセス B ソフトウェア割込み カーネル

Ctrl-C ソフトウェア割込みとシグナル ソフトウェア割込みの機能は、シグナル(signal)という名前で実現 されている。 シグナルとは、本来はプロセス間通信の一種で、あるイベントが起き たことを他のプロセスに知らせることである。 シグナルで伝わるのは、あるイベントが 起きたかどうかだけで、イベントの種類の区別ができることがあるが、 データを送ることはできない。 Ctrl-C プロセス A プロセス B プロセス間通信 シグナル カーネル

キーボードからのシグナル プロセス間でシグナルにより通信をする他に、キーボードからシグナルを送ることも できる。 キーボードからのシグナルは、「ソフトウェア割込み」として、プロセス1つひとつに割込みボタンが付いているようなものである。 プロセスA signal(SIGINT,stop); void stop() { … } プロセスB Ctrl-C シグナル

例外 (exception) プログラムの中で例外 (exception)が起きた時にも、ハードウェアの割込みと同様に、ソフトウェ ア割込みが生じる。 例外 (exception)も、他のシグナルと同じように受け取ることができる。 プロセスA signal(SIGINT,stop); void stop() { … } プロセスB Ctrl-C 例外 (exception) シグナル

キーボードからのシグナルの応用 $ cat > gomi a b c Ctrl-Z [1]+ Stopped cat >gomi $ fg cat >gomi d e f $ cat gomi $ Ctrl-Z 再開 Ctrl-C

alarmシステムコールからのタイマーシグナル シグナルの種類 種類 発生原因 デフォルト動作 SIGHUP 端末のハングアップ 終了 SIGINT Ctrl-C SIGQUIT Ctrl-\ コアダンプ SIGILL 不正な命令 SIGTRAP トレース SIGABRT abort関数の実行 SIGBUS バスエラー SIGFPE 浮動小数点例外 SIGKILL killシグナル SIGUSR1 ユーザ定義シグナル SIGSEGV 不正なメモリ参照 SIGUSR2 SIGPIPE バイプの破壊 SIGALRM alarmシステムコールからのタイマーシグナル SIGTERM 終了シグナル SIGCLD 子プロセスの停止、終了 無視 SIGCONT いったん停止からの再開 SIGSTOP プロセスのいったん停止 停止 SIGTSTP Ctrl-Z

ソフトウェア割込み(シグナル)の利用法 受け側(割り込まれる方、シグナルを受け取る方) 割込みハンドラの定義。割込みが起きた時に実行される関数を定義する。 割込みハンドラの登録。定義した関数を登録する。signal(2), sigvector(2), などを使う。 割込みマスク(割込みを禁止のビット・ベクトル)の制御。 sigsetmask(2) など。 送り側(割り込む方、シグナルを送る方) 割込みの発生。kill(2) など。 キーボード。 例外。 タイマ割り込み。alarm(2)。 割り込みハンドラが設定されていない時には、プロセスは、デフォルトの動き をする。デフォルトには、次の3つがある。 プロセスが終了させられる。 プロセスが一時停止させられる。 なにも起らない(シグナルが無視される)。 signal の種類は、man 7 signal (Linux) で表示される。

signalシステム・コール プロセス シグナルを受け取ったときの処理を指定 インクルードファイル #include <signal.h> 書式 sighandler_t signal(int signum, sighandler_t sighandler); 引数 signum  シグナルの種類 sighandler シグナルハンドラのアドレス デフォルト動作: sighandler=SIG_DFL シグナルを無視: sighandler=SIG_IGN 戻値 成功時 前回のシグナルハンドラのアドレス 失敗時 SIG_ERR 使用例 void stop(); signal(SIGINT, &stop); プロセス signal(SIGINT,stop); void stop() { … } シグナル

signalプログラミング(1/2) signal-int.c signal() で、割込み処理ハンドラを関数 sigint_handler()登録している。この段階で、関数 sigint_handler() は呼び出されない。また、プログラムのどこからも、関数 sigint_handler() は明示的には呼び出されていない。 main() は、無限ループになっている。 pause() は、割込みを待つシステムコールである。システムコールの実行中に 割込みが発生するまで待つ。発生すると、割込み処理ハンドラの実行後にリターンする。 sigint_handler() は、main() から呼び出されないが、割込みが発生すると実行される。内部では、大域変数 sigint_count を減らして、0 以下になれば終 了している。

signalプログラミング(2/2) timer.c signal() で、割込み処理ハンドラ関数 sigint_handler()を登録している。この段階で、関数 sigint_handler() は呼び出されない。また、プログラムのどこからも、関数 sigint_handler() は明示的には呼び出されていない。 main() は、 "."を永久ループにより1秒毎に出力。 sigint_handler() は、main() から呼び出されないが、割込みが発生すると実行され、SIGINT を受け付けて終了(経過時間をプリント)。

シグナルalarmプログラミング(1/2) alarm.c alarm(秒) は、指定した秒の経過後にSIGALRMを発生 signal() で、割込み処理ハンドラ関数 func()を登録している。この段階で、関数 func() は呼び出されない。また、プログラムのどこからも、関数 func() は明示的には呼び出されていない。 main() は、 alarm()で1秒後にSIGALRMの発生を指示、そして永久ループに入る。 func() は、main() から呼び出されないが、割込みが発生すると実行され、 SIGALRMを受け付けてメッセージをプリントし、再び、 alarm()で1秒後にSIGALRMの発生を指示。 結果、毎秒、割込み処理ハンドラ関数 func() が呼び出され、メッセージをプリント。 alarm.c

シグナルalarmプログラミング(2/2) alarm-pause.c signal() で、割込み処理ハンドラ関数 func()を登録している。この段階で、関数 func() は呼び出されない。また、プログラムのどこからも、関数 func() は明示的には呼び出されていない。 main() は、 alarm()で1秒後にSIGALRMの発生を指示、そしてpause() により割り込みの発生を待つ。 func() は、main() から呼び出されないが、割込みが発生すると実行され、 SIGALRMを受け付けてメッセージをプリント alarm-pause.c

シグナルkillプログラミング(1/3) kill-group.c kill(0,1) 自分と同じグループIDを持つプロセス全てに、プロセスの強制終了シグナルを送信 (シグナル番号に 0 を入れる)

シグナルkillプログラミング(2/3) kill-pid.c kill(pid,1)

シグナルkillプログラミング(3/3) kill(pid,0) kill-query-pid.c if(kill(pid,0) != EOF) プロセスは存在する kill-query-pid.c