21

間に違いはありますか

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

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

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

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

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

4

5 に答える 5

18

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

Kernel.org - on_exit():

この関数は SunOS 4 に由来しますが、libc4、libc5、および glibc にも存在します。Solaris (SunOS 5) では発生しなくなりました。この関数を避け、代わりに標準の atexit(3) を使用してください。

于 2008-08-14T04:59:55.607 に答える
14

私が見つけたこのリンクによると、いくつかの違いがあるようです。 on_exit関数が呼び出されたときに関数に渡される引数を渡すことができon_exitます...これにより、終了するときにいくつかのクリーンアップ作業を行うためのポインターを設定できる場合があります。

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

于 2008-08-14T05:03:17.707 に答える
4

違いは、それatexitが C でon_exitあり、GNU および who-knows-what-other Unixy システムで利用可能ないくつかの奇妙な拡張機能であることです (ただし、POSIX の一部ではありません)。

于 2010-07-17T20:20:53.750 に答える
1

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

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

于 2008-08-14T08:09:47.563 に答える
0

@ネイサン

最初に、終了ステータスを決定するための別の API 呼び出しがあるかどうかを確認します...一目見ただけではわかりませんが、標準の C API に精通していません。

簡単な代替手段は、終了ステータスを格納するグローバル変数を持つことです...デフォルトは不明なエラー原因です(プログラムが異常終了した場合)。次に、exit を呼び出すと、終了ステータスをグローバルに格納し、任意の atexit 関数から取得できます。on_exitこれには、すべての終了呼び出しの前に終了ステータスを入念に保存する必要があり、明らかに理想的ではありませんが、API がなく、プラットフォーム上にいないリスクを冒したくない場合は、これが唯一のオプションになる可能性があります。

于 2008-08-14T06:51:23.337 に答える