多くのコンピュータオペレーティング システムでは、コンピュータ プロセスはexitシステム コールを実行して実行を終了します。より一般的には、マルチスレッド環境での exit は、実行スレッドが停止したことを意味します。リソース管理では、オペレーティング システムはプロセスによって使用されたリソース(メモリ、ファイルなど) を再利用します。プロセスは、終了すると デッド プロセスと呼ばれます。
仕組み
UnixおよびUnix 系 オペレーティング システムでは、親プロセスがfork システム コールを実行するとプロセスが開始されます。親プロセスは、子プロセスが終了するまで待機するか、実行を継続します (他の子プロセスをフォークする可能性もあります)。子プロセスがexit の呼び出しによって正常に終了するか、致命的な例外またはシグナル(例: SIGTERM、SIGINT、SIGKILL )によって異常終了すると、終了ステータスがオペレーティング システムに返され、SIGCHLDシグナルが親プロセスに送信されます。親プロセスはwaitシステム コールを使用して終了ステータスを取得できます。
ほとんどのオペレーティング システムでは、終了プロセスが特定の終了ステータスをシステムに提供でき、そのステータスは親プロセスで利用できるようになります。通常、これは整数値ですが、一部のオペレーティング システム (例: Bell Labs の Plan 9 )では文字列を返すことができます。整数値を返すシステムでは、通常、ゼロ値は正常な実行を示し、ゼロ以外の値はエラー状態を示します。その他のシステム (例: OpenVMS ) では、偶数値は成功、奇数値はエラーを示します。さらにその他のシステム (例: IBM z/OSおよびその前身) では、整数値の範囲を使用して、成功、警告、およびエラーの完了結果を示します。
掃除
終了操作は、通常、制御をオペレーティング システムに戻す前に、プロセス空間内でクリーンアップ操作を実行します。一部のシステムおよびプログラミング言語では、ユーザーサブルーチンを登録して、プロセスが実際に完全に終了する前にプログラム終了時に呼び出すことができます。終了の最終ステップとして、プリミティブ システム終了呼び出しが呼び出され、プロセスが終了したことをオペレーティング システムに通知し、プロセスによって使用されたリソースを再利用できるようにします。
通常のクリーンアップをバイパスできる場合もあります。C99では、追加のプログラム クリーンアップなしで現在のプロセスを終了する関数が提供されています。これは、たとえば、呼び出しが子プロセスの置き換えに失敗したときにfork-exec_exit()ルーチンで使用できます。呼び出しルーチンは、親に属するリソースを誤って解放します。
execatexit
孤児とゾンビ
一部のオペレーティング システムでは、親プロセスが終了した子プロセスを特別な方法で処理します。このような孤立プロセスは、特別なルート プロセスの子となり、ルート プロセスは子プロセスが終了するのを待ちます。同様に、ゾンビ プロセスの処理にも同様の戦略が使用されます。ゾンビ プロセスとは、終了した子プロセスですが、その終了ステータスは親プロセスによって無視されます。このようなプロセスは特別な親プロセスの子となり、親プロセスは子の終了ステータスを取得し、オペレーティング システムがデッド プロセスの終了を完了できるようにします。これらの特別なケースを処理することで、システムプロセス テーブルが一貫した状態に保たれます。
例
次のプログラムは終了し、成功の終了ステータスをシステムに返します。
コボル:
識別部。プログラム ID 。成功プログラム。手続き部。メイン。戻りコードにゼロを移動。プログラム終了。
プログラムwiki
呼び出し exit ( 0 )プログラムwikiの終了
ジャワ:
パブリッククラスSuccess { public static void main ( String [] args ) { System . exit ( 0 ); } }
パスカル:
プログラムwiki ; begin ExitCode := 0 ; exit end .
終了0
パール:
#!/usr/bin/env perl を
終了します;
PHP :
<?php
exit ( 0 );
パイソン:
#!/usr/bin/env python3
import sys
sys . exit ( 0 )
終了0
; MASM / TASMの場合 .モデル スモール 。スタック 。コード メインPROC NEAR MOV AH, 4Ch ; サービス 4Ch - エラー コードで終了 MOV AL, 0 ; エラー コード INT 21h ; 割り込み 21h - DOS の一般的な割り込み メインENDP END main ; mainから始まる
プログラマーによっては、INT 21h 用にすべてを一度に準備する場合もあります。
MOV AX, 4C00h ; 00を16進数のエラーコードに置き換えます
; NASMの場合 MOV AL, 1 ; 関数1: exit() MOV EBX, 0 ; 戻りコード INT 80h ; #割り込みベクター に制御を渡す# システムコールを呼び出す — この場合はシステムコール 番号 1 と引数 0
# GASの場合 。文章 .グローバル_開始 _始める: movl $1, %eax # システムコール番号 1: exit() movl $0, %ebx # 終了ステータス0で終了 int $0x80 #割り込みベクターに制御を渡す # システムコールを呼び出す — この場合は 引数 0 を持つシステムコール番号 1
Linux 64 ビットx86 64アセンブリ: FASM用
フォーマットELF64実行可能ファイル3エントリ開始セグメント読み取り可能実行可能ファイル開始: ; STUFF ; 終了mov eax , 60 ; sys_exit システムコール番号: 60 xor edi , edi ; 終了ステータスを 0 に設定 (`xor edi, edi` は `mov edi, 0` に等しい)システムコール; 呼び出す
グローバル_メイン
セクション.text
_main:
mov rax , 0x02000001 ; sys_exit システムコール番号: 1 (OS X の場合は 0x02000000 を追加) xor rdi , rdi ; 終了ステータスを 0 に設定 (`xor rdi, rdi` は `mov rdi, 0` に等しい) syscall ; exit() を呼び出す
ウィンドウズ
Windows では、プログラムは ExitProcess または RtlExitUserProcess 関数を呼び出すことによって自身を終了できます。
参照
参考文献
- ^ ポール、マティアス R. (1997-07-30) [1994-05-01]. 「II.4. 外部コマンドの管理」。 NWDOS-TIP — Novell DOS 7 に関するヒントとコツ、詳細、バグ、回避策を含む Blick です。リリース 157 (ドイツ語) (第 3 版)。 2016-11-05 のオリジナルからアーカイブ。2012 年 1 月 11 日に取得。
{{cite book}}:|work=無視 (ヘルプ) (NB. Novell DOS 7およびOpenDOS 7.01NWDOSTIP.TXTに関する包括的な作業であり、多くの文書化されていない機能と内部の説明が含まれています。これは、2001 年まで維持され、当時多くのサイトで配布されていた著者のさらに大規模なコレクションの一部です。提供されたリンクは、HTML に変換された古いバージョンのファイルを指し示します。) [1]MPDOSTIP.ZIP
外部リンク
- : プロセスを終了する – The Open Groupの System Interfaces Reference、 The Single UNIX Specificaion、バージョン 4
- std::exit の C++ リファレンス
