問題タブ [setjmp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - Cエラー処理にlongjmp/setjmpを使用する「良い」方法は何ですか?
私は 1 つのプロジェクトで C を使用する必要がありlongjmp/setjmp、エラー処理に使用することを考えています。リターン コードよりも中央の 1 か所でエラーを処理する方がはるかに簡単だと思うからです。これを行う方法についていくつかの手がかりがあれば幸いです。
そのようなエラーが発生した場合に、リソースのクリーンアップが正しく行われることに特に関心があります。
また、それらを使用するマルチスレッド プログラムで発生するエラーをどのように処理すればよいですか?
さらに良いことに、エラー/例外処理用に既に存在する C ライブラリはありますか?
c++ - C++: longjmp と setjmp を使用しても安全ですか?
以下に関して、linux/gcc の C++ で longjmp と setjmp を使用しても安全ですか?
- 例外処理 (私は longjmp/setjmp を使用して例外処理を実装していません。longjmp/setjmp が標準の例外処理に与える副作用を知りたいです)
*thisポインター- シグナル
- スマート ポインター (boost の共有ポインターと侵入ポインター)
- あなたが考えることができる他の何でも。
c - pthreads、setjmp、longjmp。関数の実行が終了したことをどのように知ることができますか?
私はユーザースペースのスレッドライブラリを書いています。各スレッドを管理する構造体があります。私のスレッドは非常に単純で、関数ptrとその引数を取り、その関数を1回実行するだけです。
各スレッドにはjmp_bufがあり、setjmpとlongjmpを使用してスレッドを切り替えます。私が理解できないことの1つは、この関数がいつ終了したかを知る方法です。
スレッドごとに、2つの方法でjmpbufを変更します。
- PCを編集して関数ポインタに設定したので、次にプログラムカウンターがそこに行きます。
- また、それぞれに独自のスタックを作成し、そのスタックを指すようにSPを編集します
したがって、スレッド制御構造体を使用して、スレッドを切り替え、各スレッドに状態を維持させることができますが、その関数がいつ終了したかを知る方法がわかりません。それが終わったら、私が持っている特別なexit()関数を呼び出したいと思います。
c - シグナルハンドラからの longjmp()
次のコードを使用して、ユーザーからの入力を読み取ろうとし、5 秒以上経過するとタイムアウトして終了します。これは、setjmp/longjmp と SIGALRM シグナルの組み合わせによって実現されます。
コードは次のとおりです。
さて、私の質問は、この関数で問題が発生する可能性があるかどうかです。シグナルハンドラから longjmp() を呼び出すと、未定義の動作が発生する可能性があることを読みましたが、正確には何を参照していますか?
また、fgets() が返された直後で、alarm(0) が呼び出される前にアラームがトリガーされた場合はどうなるでしょうか? ユーザーが何かを入力した場合でも、関数は -2 を返しますか?
LATER EDIT:コードを改善する方法には興味がありません。どのように失敗するのか知りたいだけです。
c - 優れたsetjmp/longjmpチュートリアル
こんにちは私はCのsetjmp/longjmpに関する良いチュートリアルを読みたいと思います。人工的ではなく実際の例があるとよいでしょう。
ありがとう。
c - Jmp_buf 構造体の各エントリは何を保持していますか?
私は Ubuntu 9.10 (Karmic Koala) を実行していjmp_bufます。単純に 12 個の int の配列である構造を調べました。を使用setjmpして構造体を渡すと、jmp_buf12 個のエントリのうち 4 個が保存されます。これらの 4 つのエントリは、スタック ポインタ、フレーム ポインタ、プログラム カウンタ、およびリターン アドレスです。残りの 8 つのエントリは何ですか? それらはマシンに依存していますか? 別のエントリはセグメント テーブルのベース レジスタですか? スレッド/プロセスの環境を適切に復元するには、他に何が必要ですか? man ページやその他の情報源を調べましたが、 のアセンブリ コードが見つかりませんでしたsetjmp。
c++ - setjmp を使用した C++ オブジェクトで「上書きされる可能性がある」という警告
上記のコードを GCC 4.4.1、g++ test.cc -Wextra -O1 でコンパイルすると、次の紛らわしい警告が表示されます。
stl_vector.h の 1035 行目は、foo の構築中に呼び出した vector(n, value) コンストラクターによって使用されるヘルパー関数にあります。コンパイラが引数の値を把握できる場合 (数値リテラルなど)、警告は消えます。このテスト ケースでは、コンパイラがその値を判断できないため、argc を使用します。
警告は、setjmp ランディング ポイントの後に実際に発生するようにコンパイラがベクトル構築を最適化するためである可能性があると思います (これは、コンストラクター引数が関数のパラメーターに依存する場合のようです)。
できればsetjmp部分を別の関数に分割することなく、問題を回避するにはどうすればよいですか?
エラー処理に setjmp を使用する必要がある多数の C ライブラリに行き詰まっているため、setjmp を使用しないという選択肢はありません。
setjmp - シグナルハンドラとsetjmp/longjmpを使用したプリエンプティブマイクロスレッドの実装
Linux環境でPOSIX準拠のマイクロスレッドを実装したいと思います。基本的な考え方は次のとおりです。
- ここで説明する手法を使用して、各ファイバーに新しいスタックスペースを割り当てます。
- setitimerを使用して、一定の時間間隔で信号を送信するタイマーを作成します。このタイマーのシグナルハンドラーは、スケジューラーとして機能し、ファイバーを切り替えます。
問題は、シグナルハンドラーでlongjmpを実行してもハンドラーが終了しないため、カーネルは新しいシグナルを配信する代わりに、ハンドラーの終了を待機することです。これにより、切り替えを開始する信号がないため、コンテキストの切り替えが不可能になります。1つの解決策は、SIGALRMのブロックを解除することです。これにより、多くのシグナルが同時にハンドラーを実行できますが、これにより競合状態の問題が発生します。
プリエンプティブマイクロスレッドを実装するための最良かつ最も簡単な方法は何ですか?私がGoogleで見つけたすべての例は、先制的ではありませんでした。
c - atexit コマンドを取り消したり削除したりできますか?
終了スタックに置くatexit( fn );と、プログラムが終了したときに実行されます: return frommain()または via exit().
スタックから削除できますか?
なぜ私はこれをしたいのですか?
atexit、setjmpおよびを使用して、単純な try-catch メカニズムを試していましたlongjmp。undo-atexit(fn);最後に登録された関数でしか機能しない場合でも、できれば完璧です。
編集:
モノセレスの提案に従って、独自のスタックを作成します...
現在、スタックは 1 つの例外キャッチャーでのみ機能します。
setjmp - setjmp、longjmpを使用したマルチタスク
関数を使用setjmpしてマルチタスクを実装する方法はありますかlongjmp