Movatterモバイル変換


[0]ホーム

URL:


BLOGTIMES

cles::blog

平常心是道
« :: »
2010/06/30

setjmp() と longjmp() と 例外処理

  c 
このエントリーをはてなブックマークに追加

setjmp()*1とlongjmp()*2については大昔にちょっと聞いたくらいなのでどのような機能なのかすっかり忘れてしまっていたのでちょっと復習していたのでメモ。そもそも個人的に一番C言語の勉強に活用したと思うqmailにはsetjmp()もlongjmp()もでてこないので、なじみが無くても仕方がなかったりするわけですが。

とりあえずそれぞれの関数のプロトタイプはこんな感じ。

int setjmp( jmp_buf jmp );void longjmp( jmp_buf jmp, int ret );

setjmp()を呼び出すと、jmpにコンテキストが記録される(戻り値は0)。コンテキストは主にレジスタの状態が記録された構造体(当然、保存される情報にはプログラムカウンタやスタックポインタが含まれている)。

後でjmpをlongjmp()に渡すとレジスタがjmpを呼んだ時点のものに書き換えられるので、プログラムの実行は強制的にsetjmp()を呼んだ部分から再開される(CPUにとっては現在の実行行はプログラムカウンタの値に過ぎないから)。

単に戻ってくるだけだと、記録するためのsetjmp()なのか、longjmp()によって実行が戻されてsetjmp()が呼ばれたように見えるのかが区別できなくて困るので、longjmpの第2引数にretを渡すとsetjmp()の戻り値がretになるようになっている。よって、retには0ではない数を指定する必要がある。

という風に理解しました。

例えば下記のようなプログラムを流すと下記のような感じになることは確認できました。
ちなみに、setjmp()しないで、longjmp()を呼ぶとプログラムが落ちます

test.c

#include <stdio.h>#include <setjmp.h>static jmp_buf buf;void bar() { printf("bar called!\n"); longjmp(buf,2);}void foo() { printf("foo called!\n"); bar();}int main() { int ret = setjmp(buf); if ( ret == 0 ) { foo(); } else { printf("ret:%d\n", ret); } return 0;}

実行結果

$ ./a.outfoo called!bar called!ret:2

困ってしまったのは、正直これの使いどころが良くわからないこと。

事例を調べていたらマクロを活用することによって「Omicron Cでtry-catchを使う」のように例外処理に使えるということはひとまずわかりました。ただ、コンパイラによる支援がまったく無いのでthrowをする可能性がある場所を、try~catchで囲み忘れるという事故が頻発しそうな気がします。こういうところから、Javaの検査例外の意義を再認識しましたが、今の自分が使うと収集がつかなくなりそうな気がします。このあたりはC言語バリバリの人に意見を聞きに行かないといけないかなぁ。


byhsur at 18:22[5年前][4年前][3年前][2年前][1年前][1年後][2年後][3年後][4年後][5年後] |
こんな記事もあります 「setjmp 例外処理 C言語
2020 年の人気エントリ Top 100
WSL に CX-Checker を一撃でセットアップする
Ruby 2.6 から JIT コンパイルが可能に
ブラウザだけでプログラミングが始められる「Coding Ground」
milter-manager 環境 に smf-spf v2.2 をインストール
const int *p と int * const p の違い
苦(くる)Cと学習用C言語開発環境
C言語向けの脆弱性検査ツール
Apache Lucy という全文検索ライブラリ
K&R のデニス・リッチー氏が逝去
トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3630
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL:Yahoo! JAPAN IDでログイン

« :: »
Copyright © 2004-2023 by CLES All Rights Reserved.
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 .アーロンチェアのポスチャーフィットを修理(100540)
2 .福岡銀がデマの投稿者への刑事告訴を検討中(99859)
3 .年次の人間ドックへ(99818)
4 .三菱鉛筆がラミーを買収(99411)
5 .2023 年分の確定申告完了!(1つめ)(99386)
最新のエントリ
cles::blogについて
誰が書いてる?
最近行った場所
サイトポリシー
タグ一覧
検索ワードランキング

Referrers

    Powered by CLES
    Nucleus CMS v3.31SP3/w memcached
    21393797(W:4456 Y:1531 T:0063)
    cles::blogのはてなブックマーク数
    benchmark


    [8]ページ先頭

    ©2009-2025 Movatter.jp