8

setjmp と longjmp の定義を知っています。setjmp は環境をスタック コンテキストに保存し、もう一方は復元します。

ただ、私の理解不足はどこかにあると思います。どうすれば保証できるか、どのように保存され、どのように復元されるかについて、良い例を挙げて説明してもらえますか?

jmp_buf で指定されている CPU レジスタが多数あることがわかりました。しかし、どうすればそれが復元されたことを保証できますか?

きちんとした例で説明するのを手伝ってください。スタックオーバーフローに関する他の質問をグーグルで参照しましたが、明確な例はありません。

事前に多大な感謝を申し上げます。

PS: Linux/Unix コンテキストのみからのものである必要があります。

4

1 に答える 1

8

を呼び出すとlongjmp()、これらすべてのレジスタが自動的に復元され、対応する への呼び出しで実行が続行されますsetjmp()が、今回は異なる戻り値になります (親と子で戻り値が異なるsetjmp()のと同様)。fork()

setjmp()/longjmp()限られた環境のみを保存します。特に、完全なスタックではなく、スタック ポインターを保存するだけなので、同じ関数または呼び出し元の関数にしか戻ることができません。POSIX には がsetcontext()あり、スタックを切り替えることができるため、ユーザー空間スレッド (フィブリル、グリーンスレッドなど) などの実装にすぐに役立ちます。

于 2011-07-31T17:36:40.713 に答える