on_exit() 関数と atexit() 関数の間に違いはありますか?

StackOverflow https://stackoverflow.com/questions/10680

  •  08-06-2019
  •  | 
  •  

質問

何か違いはありますか?

   int on_exit(void (*function)(int , void *), void *arg);

そして

   int atexit(void (*function)(void));

on_exit で使用される関数が終了ステータスを取得するという事実以外は?

つまり、終了ステータスを気にしない場合、どちらかを使用する理由はあるのでしょうか?

編集: 回答の多くは警告しました on_exit それは規格外だからです。企業内で使用するための、特定の構成での実行が保証されているアプリを開発している場合、これについて心配する必要がありますか?

役に立ちましたか?

解決

によると このリンク 調べてみたところ、若干の違いがあるようです。 on_exit に渡される引数を渡すことができます。 on_exit 呼び出されたときの関数...これにより、終了時にクリーンアップ作業を行うためのポインタを設定できる場合があります。

さらに、どうやら、 on_exit これは SunOS 固有の機能であり、すべてのプラットフォームで互換性があるわけではない可能性があります...したがって、より制限が厳しくなるにもかかわらず、atexit を使い続けることをお勧めします。

他のヒント

使用する必要があります atexit() もし可能なら。 on_exit() は非標準であり、あまり一般的ではありません。たとえば、OS X では利用できません。

カーネル.org - on_exit():

この機能はSunos 4からのものですが、Libc4、Libc5、Glibcにも存在します。Solaris (SunOS 5) ではこの問題は発生しなくなりました。この関数を避け、代わりに標準のatexit(3)を使用します。

違いは、 atexit はCであり、 on_exit これは、GNU や他の Unixy システムで利用できる奇妙な拡張機能です (ただし、 ない POSIX の一部)。

@Nathan、現在実行中のプロセスの終了コードを返す関数が見つかりません。その時点ではまだ設定されていないと思います atexit() とにかく呼ばれます。これは、ランタイムはそれが何であるかを知っていますが、おそらくそれを OS に報告していないことを意味します。ただし、これはほとんど単なる推測にすぎません。

どちらかを使用する必要があるようです on_exit() または、終了コードが問題にならないようにプログラムを構造化してください。メイン関数の最後のステートメントでグローバルを反転することは不合理ではありません。 exited_cleanly 変数を true に設定します。登録した関数内で atexit(), 、この変数をチェックして、プログラムがどのように終了したかを判断できます。これで得られる状態は 2 つだけですが、ほとんどのニーズにはこれで十分だと思います。必要に応じて、このタイプのスキームを拡張して、より多くの終了状態をサポートすることもできます。

@ネイサン

まず、終了ステータスを決定するための別の API 呼び出しがあるかどうかを確認します。ざっと見ただけでは見つかりませんが、私は標準の C API に詳しくありません。

簡単な代替方法は、終了ステータスを保存するグローバル変数を用意することです。デフォルトは不明なエラー原因です (プログラムが異常終了した場合)。その後、exit を呼び出すと、終了ステータスをグローバルに保存し、任意の atexit 関数から取得できます。これには、終了呼び出しのたびに終了ステータスを熱心に保存する必要があり、明らかに理想的ではありませんが、API がなくリスクを負いたくない場合には、 on_exit プラットフォームにいない...それが唯一の選択肢かもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top