問題タブ [atexit]
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.
python - Python プログラムの *成功した* 終了時にのみ呼び出される関数を登録するにはどうすればよいですか?
Python プログラムの終了時にタスクを実行したいのですが、それは正常に終了した場合のみです。私の知る限り、atexit モジュールを使用すると、成功したかどうかに関係なく、プログラムの終了時に登録済みの関数が常に実行されます。成功した終了時にのみ実行されるように関数を登録する同様の機能はありますか? または、終了関数が終了が正常か例外かを検出する方法はありますか?
問題を示すコードを次に示します。プログラムが失敗した場合でも、プログラムが成功したことが出力されます。
出力:
c - atexit()でのExecvレジスタの問題
「呼び出し元のプロセスイメージでatexit()によって登録された関数は、新しいプロセスイメージに登録されていません」。
コードは次のとおりです。
check_mem関数がexecv()の後に呼び出されません。上記の「線」のため。execv呼び出し後に関数を登録するためのハックはありますか?
よろしくお願いします。
c - vfork() atexit アサーションが失敗しました
次のコードを理解しようとしています
そして、vfork() が悪いとか、こういうことだとは言わないでください。私はそれが であることを知っていますが、この種のエラーを引き起こしているこのコードで正確に何が起こっているのでしょうか。前もって感謝します
c++ - atexit に値を渡す
必要に応じて、一連のクリーンアップ機能をプッシュしたいと考えています。パラメータなしで1つのクリーンアップ関数に対してこれを行うためにatexitを使用していましたが、このアプローチを複数のクリーンアップ関数に拡張する方法がわかりません。私はboost::bindにあまり詳しくありませんが、それが私の関数をスレッドにバインドする方法であるため、それは良い考えだと思いました...
C ++では、以下を機能させようとしています:
関数定義
コード:
エラー:
前もって感謝します!
dll - 混合モードの C++/CLI DLL が終了時に例外をスローする
作成した C++/CLI 混合モード DLL に問題があります。それを使用する.NETアプリケーションが終了すると、アンロード時に例外がスローされます。の実行後DLL_PROCESS_DETACH
、DLL は自動的に登録された関数を使用してランタイム クリーンアップをatexit() / __onexit()
行い、次の例外をスローします。
atexit()
静的ブースト例外オブジェクトによって登録された呼び出しに問題を追跡しましたget_static_exception_object()
。
ローダーロックを回避するために動的にリンクされているboost::threadを除いて、ほとんどの部分で静的にリンクされたboost_1_47を使用しています。また、ブーストのすべてを動的にリンクしようとしましたが、役に立ちませんでした。#pragma unmanaged
また、すべてのブースト インクルードはブロックで囲まれています。
誰かが同様の問題を抱えているか、解決策を知っていることを願っていますか?
ありがとう、マーク
例外が発生する直前のコール スタックを次に示します。
c - atexit() で登録された関数への参照を取得する
を使用して登録された関数の場合atexit()
: それらへの参照を取得して直接呼び出すことは可能ですか?
gcc
これは一般的な質問ですが、 /の使用に関する解決策glibc
は大歓迎です。
python - 登録された atexit 関数でエラー トレースバックを取得する
プロセスがシャットダウンする原因となったエラーをログに記録しようとしていますが、発生したエラーが何であるかを認識しtraceback.print_tb
てtraceback.print_exc
いないようです。
言い換えれば、次のように出力すると、'DivisionByZero .. etc ..' ではなく 'None\n' と表示されるのはなぜですか? (編集: ..そして、exit_fn 内から発生/処理されたエラーにアクセスするにはどうすればよいですか?)
visual-c++ - アプリケーションのシャットダウンでのクラッシュ - atexit の問題?
アプリケーションのシャットダウン中に、プロセスの 1 つがクラッシュしています。ErrorHandlingClient は dll です。クラッシュ ダンプに次の行が表示されます。
"`CErrorLog::m_IErrorHandlingServerPtr の動的 atexit デストラクタ"
スタックオーバーフローもmsdnで検索しました。明確な答えを得ることができませんでした。私たちのアプリケーションは vc 9.0 コンパイラに移植されています。以前のバージョンでは、この問題は発生していません。クラッシュダンプを貼り付けています。
python - Pythonでatexitコールバックが呼び出されたときに終了コードまたは理由を見つける方法は?
Pythonスクリプトが正しく終了しているかどうかを知りたいです。これには私が使用してatexit
いますが、問題は、atexitがsys.exit(0)で呼び出されたか、ゼロ以外で呼び出されたか、例外で呼び出されたかを区別する方法がわからないことです。
理由:プログラムが適切に終了した場合、プログラムは例外によって終了した場合、またはゼロ以外のエラーコード(終了ステータス)を返した場合以外は何もしません。何らかのアクションをトリガーしたいと思います。
なぜtry/finalを使用していないのか不思議に思うかもしれませんが、これは、共通のモジュールをインポートしている多数のスクリプトに同じ動作を追加したいためです。それらすべてを変更する代わりに、インポートされるモジュールにatexit()ハックを追加し、それらすべてでこの動作を無料で取得したいと思います。
python - マルチプロセッシング、atexit、およびグローバル データのエラー
前もって申し訳ありませんが、これは長くなります...
おそらく関連しています:
Python マルチプロセッシング atexit エラー「atexit._run_exitfuncs のエラー」
間違いなく関連:
グローバルデータを使用したpythonパラレルマップ(multiprocessing.Pool.map)
Python のマルチプロセッシング プールでのキーボード割り込み
これは、私の問題を説明するために一緒にハッキングした「単純な」スクリプトです...
これは、KeyboardInterrupt が発生しない場合に問題なく機能します。ただし、1 つ上げると、次の例外が発生します。
興味深いことに、コードは追加の関数を呼び出さずに Pool.map 関数を終了します...問題は、ある時点で KeyboardInterrupt が適切に処理されていないように思われますが、それがどこにあるのか少し混乱しています。なぜ割り込み可能で処理されないのですか。ありがとう。
使用すると同じ問題が発生することに注意してください out=p.map_async(wrapper,range(30)).get()
編集1
out=p.map(...)
もう少し近づいて...を句で囲むtry,except,finally
と、最初の例外が取り除かれます...ただし、他の例外は引き続き atexit で発生します。上記のコードとトレースバックが更新されました。
編集2
上記のコードには、コメントとして機能しないものが追加されています。(同じエラー)。この試みは、次のことに触発されました。
http://jessenoller.com/2009/01/08/multiprocessingpool-and-keyboardinterrupt/
編集3
上記のコードに追加されたシグナルを使用して別の試みが失敗しました。
編集4
上記が不要になるようにコードを再構築する方法を見つけました。(ありそうもない)誰かが私と同じユースケースでこのスレッドに出くわした場合、私は私の解決策を説明します...
使用事例
モジュールを使用して一時ファイルを生成する関数がありtempfile
ます。プログラムの終了時にこれらの一時ファイルをクリーンアップしたいと思います。私の最初の試みは、各一時ファイル名をリストにパックしてから、 を介して登録された関数を使用してリストのすべての要素を削除することでしたatexit.register
。問題は、更新されたリストが複数のプロセスにわたって更新されていなかったことです。multiprocessing.Manager
ここで、リスト データを管理するために を使用するというアイデアを思いつきました。残念ながら、KeyboardInterrupt
何らかの理由でプロセス間の通信ソケットが壊れているため、これはどれだけ頑張っても失敗します。この問題の解決策は簡単です。マルチプロセッシングを使用する前に、一時ファイル ディレクトリを設定します。tempfile.tempdir=tempfile.mkdtemp()
次に、一時ディレクトリを削除する関数を登録します。各プロセスは同じ一時ディレクトリに書き込むため、機能します。 もちろん、このソリューションは、共有データが、プログラムの寿命の終わりに削除する必要があるファイルのリストである場合にのみ機能します。