exit(システムコール)

多くのコンピュータオペレーティングシステムでは、コンピュータプロセスはexitシステムコールを発行することで実行を終了します。より一般的には、マルチスレッド環境におけるexitは、実行スレッドが停止したことを意味します。リソース管理のために、オペレーティングシステムはプロセスによって使用されたリソースメモリファイルなど)を回収します。プロセスは終了した後、デッドプロセスと呼ばれます

仕組み

UnixおよびUnix系 オペレーティングシステムでは、親プロセスがfork システムコールを実行するとプロセスが開始されます。親プロセスは、子プロセスが終了するまで待機するか、実行を継続する(他の子プロセスをフォークするなど)ことができます。子プロセスがexit の呼び出しによって正常に終了した場合、または致命的な例外シグナル(例:SIGTERMSIGINTSIGKILLによって異常終了した場合、終了ステータスがオペレーティングシステムに返され、SIGCHLDシグナルが親プロセスに送信されます。親プロセスはwaitシステムコールを介して終了ステータスを取得できます

ほとんどのオペレーティングシステムでは、終了するプロセスが特定の終了ステータスをシステムに提供することができ、親プロセスで利用できるようになります。通常、これは整数値ですが、一部のオペレーティングシステム(例:ベル研究所のPlan 9)では文字列を返すことができます。整数値を返すシステムでは、通常、実行成功を示すためにゼロ値を、エラー状態を示すためにゼロ以外の値を使用します。他のシステム(例:OpenVMS)は、成功には偶数値を、エラーには奇数値を使用します。さらに他のシステム(例:IBM z/OSとその前身)は、成功、警告、およびエラーの完了結果を示すために整数値の範囲を使用します。

クリーンアップ

終了操作は通常、制御をオペレーティングシステムに戻す前に、プロセス空間内でクリーンアップ操作を実行します。一部のシステムおよびプログラミング言語では、ユーザーサブルーチンを登録して、プロセスが実際に完全に終了する前にプログラム終了時に呼び出されるようにすることができます。終了の最終ステップとして、プリミティブなシステム終了呼び出しが呼び出され、オペレーティングシステムにプロセスが終了したことを通知し、プロセスによって使用されたリソースを再利用できるようにします

通常のクリーンアップを回避できる場合があります。C99_exit()、追加のプログラムクリーンアップなしで現在のプロセスを終了する関数を提供しています。これは、例えば、 fork-execexecルーチンで呼び出しが子プロセスの置き換えに失敗した場合などに使用できます。呼び出しatexitルーチンは、親プロセスに属するリソースを誤って解放してしまうからです。

孤児とゾンビ

一部のオペレーティングシステムは、親プロセスが特別な方法で終了した子プロセスを処理します。このような孤立プロセスは特別なルートプロセスの子となり、ルートプロセスは子プロセスの終了を待ちます。同様に、ゾンビプロセスの処理にも同様の戦略が使用されます。ゾンビプロセスとは、終了した子プロセスですが、その終了ステータスは親プロセスによって無視されます。このようなプロセスは特別な親プロセスの子となり、親プロセスは子の終了ステータスを取得し、オペレーティングシステムが死んだプロセスの終了を完了できるようにします。これらの特殊なケースを処理することで、システムのプロセステーブルは一貫した状態に保たれます。

次のプログラムは終了し、システムに 成功の終了ステータスを返します。

C
#include <stdlib.h> int main ( void ) { exit ( EXIT_SUCCESS ); // または return EXIT_SUCCESS }    
C++ :
import std ; int main () { std :: exit ( 0 ); // または return 0 }    

COBOL :

 識別.プログラムID .成功プログラム.手続き.メイン.戻り値ゼロを移動.プログラム終了.             

Fortran :

プログラムwiki呼び出し exit ( 0 )プログラムwiki終了  

Java :

public class Example { public static void main ( String [] args ) { System . exit ( 0 ); } }           

JavaScript ( Node.js ):

process . exit ( 0 );

Pascal :

プログラムwiki ; begin ExitCode : = 0 ; exit end     

DR-DOS バッチファイル[1]

exit 0

Perl

#!/usr/bin/env perl exit ;

PHP

<?phpexit(0);

Python:

#!/usr/bin/env python3import sysif  __name__  ==  "__main__" :  sys . exit ( 0 )

Rust :

use std :: process ; fn main () { process :: exit ( 0 ); }   

Unix シェル:

exit 0 

IBM PC 互換機用16 ビットアセンブリ言語:

; MASM / TASM用.MODEL SMALL.STACK.CODEmain PROC NEAR MOV AH, 4Ch ; サービス 4Ch - エラーコードで終了 MOV AL, 0 ; エラーコード INT 21h  ; 割り込み 21h - DOS 汎用割り込みmain ENDPEND main ; main から開始

プログラマーによっては、INT 21h のすべてを一度に準備する場合があります。

 MOV AX, 4C00h ; 00 を 16 進数のエラーコードに置き換えます。

Linux 32 ビットx86アセンブリ言語 :

; NASMの場合MOV AL, 1 ; 関数1: exit()MOV EBX, 0 ; 戻りコードINT 80h ; #割り込みベクターに制御を渡し 、システムコール(この場合は 引数0のシステムコール番号1)を呼び出します
# GASの場合.text.global _start_start: 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` と等しい)システムコール; 呼び出す                        

OS X 64ビットx86 64アセンブリ:NASM用

 グローバル_main セクション.text _main: mov rax , 0x02000001 ; sys_exit システムコール番号: 1 (OS Xの場合は0x02000000を追加) xor rdi , rdi ; 終了ステータスを0に設定 (`xor rdi, rdi`は`mov rdi, 0`と等しい) syscall ; exit()を呼び出す          

Windows

Windowsでは、プログラムはExitProcess関数またはRtlExitUserProcess関数のいずれかを呼び出すことで自身を終了できます。

参照

参照

  1. ^ Paul, Matthias R. (1997-07-30) [1994-05-01]. 「II.4. 外部コマンドの未文書化プロパティ」. NWDOS-TIPs — Novell DOS 7のヒントとコツ。文書化されていない詳細、バグ、回避策に重点を置いています。MPDOSTIP. NWDOSTIP.TXT、バージョン3、リリース157(ドイツ語)。2016年11月5日にオリジナルからアーカイブ2012年1月11日閲覧(注:これはNovell DOS 7およびOpenDOS 7.01NWDOSTIP.TXTに関する包括的な著作であり、多くの未文書化機能と内部構造の説明が含まれています。これは、著者が2001年まで維持し、当時多くのサイトで配布していた、より大規模なコレクションの一部です。提供されているリンクは、HTMLに変換された古いバージョンのファイルを指しています。)[1]MPDOSTIP.ZIP
Retrieved from "https://en.wikipedia.org/w/index.php?title=Exit_(system_call)&oldid=1321197570"