C言語 FreeBSD setjmp longjmpで大域ジャンプをする
スポンサーリンク
このドキュメントの内容は、以下の通りです。
Unixのプログラムでは、処理中にシグナルを受信した場合に、シグナル受信前に行っていた処理をやめて、ほかのことをするプログラムを書くときなどに、setjmpとlongjmpを利用することがあります。想定した時間を超えた場合に処理をやめるときなどにも利用できます。
ある意味 goto 文みたいなものなので、多用すると訳が分からなくなるので利用には注意が必要です。
サンプルコード
早速、サンプルコードです。
このプログラムは、alarm()でシグナルを発生されます。
シグナルが発生すると timeout() が呼び出されるようになっています。
まず、setjmp()で戻るべき場所を決めます。
alarm()を呼び出し、sleep()でプログラムが眠ります。
sleep()で寝ていある間に、alarm()によって、timeout()が呼び出されます。
timeout()では、特に何も処理は行わず、longjmp() で setjmp() したところに戻り、別の処理をします。
というのを for文で繰り返すプログラムです。
alarm()は、必ず、sleep()が完了する前に、アラームを発生させます。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <signal.h> #include <setjmp.h> jmp_buf jmp; void timeout ( int no ) { longjmp ( jmp, 1 ); } int main (int argc, char *argv[]) { int i = 0; for (i = 0; i < 3; ++i) { int t = setjmp ( jmp ); if ( 0 == t ) { signal ( SIGALRM, timeout ); printf ("Sleep\n"); alarm (1); sleep(2); alarm (0); } else { signal ( SIGALRM, SIG_DFL ); alarm (0); printf ("Timeout\n"); } } exit (EXIT_SUCCESS); }
コンパイル
gcc jmp.c
実行例
実行すると以下の結果になるはずです。
./a.out Sleep Timeout Sleep Timeout Sleep Timeout
実行環境について
このサンプルコードは、FreeBSDとMacOS Xでは動作しました。
しかしながら、Linuxでは、期待した動作をしません。
2回目からのalarm()が発行されず、1度目のalarm()え設定したときにしかtimeout()が呼び出されませんでした。
Linuxの場合には、sigsetjmp/siglongjmpを利用することで、問題は解決できます。
スポンサーリンク
スポンサーリンク
いつもシェア、ありがとうございます!
もっと情報を探しませんか?
関連記事
最近の記事
- パナソニック ジェットウォッシャードルツ EW-DJ61-Wのホースの修理
- LinuxセキュリティモジュールIntegrity Policy Enforcement
- アマゾンのEcho Show 5を買ったのでレビューします
- アマゾンのサイバーマンデーはAlexa Echo Show 5が安い
- Android スマートフォン OnePlus 7T と OnePlus 7の違い
- Android スマートフォン OnePlus 7 をAndroid10にアップデートしてみた
- クレジットカードのバーチャルカードの比較のまとめ
- 活動量計 Xiaomi Mi Band 4を買ってみたのでレビュー
- Android スマートフォン OnePlus 7 のレビュー
- AliExpressでスマートフォンを買い物してみた
- パソコンのホコリ対策 レンジフードフィルターと養生テープ
- 80PLUS GOLDのPC電源ユニットAntec NeoEco 750 Goldのレビュー
- イギリスの付加価値税 VAT は払い戻しを受けられる
- イギリスのロンドンでスーツケースなど荷物を預けられる場所は
- イギリスのロンドンで地下鉄やバスに乗るならオイスターカードを使おう
- イギリスのヒースロー空港からロンドン市内への行き方
- 航空便でほかの航空会社に乗り継ぎがある場合のオンラインチェックイン
- SFC会員がANA便ではなくベトナム航空のコードシェアを試して解ったこと
- ベトナムの入国審査でeチケットの掲示が必要だった話
- シアトルの交通ICカードはオルカカード(Orca)です
人気のページ
- Windows7 IME 辞書ツールで単語の登録に失敗しました
- C言語 popen()でコマンドを実行して出力を読み込む
- Windows7で休止状態にする方法
- CentOS MySQLの起動、停止、再起動
- loggerコマンドでsyslogにエラーを出力する方法
- パソコンパーツの買取をしてくれる店のまとめ
- Java Mapの使い方 get(),put(),remove(),size(),clear()
- 楽天のRポイントカードを作ってみた
- iPhone 5 から iPhone 6 に乗り換えたのでレビュー
- netstatコマンドのステータスの意味
スポンサーリンク
過去ログ
2020 : 01 02 03 04 05 06 07 08 09 10 11 122019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12