終了(システム呼び出し)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

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

仕組み

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

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

クリーンアップ

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

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

孤児とゾンビ

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

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

C
#include <stdlib.h> 

int main void  
{{
    終了EXIT_SUCCESS ); /*またはEXIT_SUCCESSを返します*/ 
}
C ++
#include <cstdlib> 

int main () 
{{
    std :: exit EXIT_SUCCESS ); //またはEXIT_SUCCESSを返します} 

COBOL

 識別 部門
 プログラムID  成功-プログラム
 
 手順 
 メイン
     ゼロ リターン コードに移動します。プログラムを終了します。 
  

Fortran

 プログラムウィキ
      呼び出し終了0 
 終了プログラムウィキ

Java

public  class  Success 
{ 
    public  static  void  main String []  args 
    { 
        System 終了0 ); 
    } 
}

パスカル

プログラム ウィキ; 
ExitCodeを開始します
        := 0 ; 終了終了  
        

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

出口0

Perl

#!/ usr / bin / env perl 
exit ;

PHP

<?php 
exit 0 );

Python

#!/ usr / bin / 
env python3 importsyssys  終了0 

Unixシェル

出口 0

DOS アセンブリ

; MASM / TASMの場合
.MODELSMALL
。スタック
。コード
メインPROCNEAR
    MOV AH、4Ch ; サービス4Ch-エラーコードMOVAL 
    、0で終了します。エラーコード
    INT21h  ; 割り込み21h-DOS一般割り込み
メインENDP
ENDメイン; メインから開始

一部のプログラマーは、INT21hのすべてを一度に準備する場合があります。

    MOV AX、4C00h ; 00をHEXのエラーコードに置き換えます

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

; NASMの場合
MOV AL、1; 関数1:exit()
MOV EBX、0; 戻りコード
INT 80h  ; #制御を割り込みベクトル
              に渡します#システムコールを呼び出します—この場合、システムコール
              #引数0の番号1
#GASの場合
。文章

.global _start

_始める:
    movl $ 1、%eax   #システムコール番号1:exit() 
    movl $ 0、%ebx   終了ステータス0で終了
    int $ 0x80       #割り込みベクトルに制御を渡します
                   システムコールを呼び出します—この場合、システムコール
                   #番号1、引数0

Linux64ビットx8664アセンブリ:FASM用

  ELF64 実行可能ファイルの フォーマット3
 
 エントリー スタート
 
 セグメント読み取り 可能実行可能ファイル
 
 開始:
     ; STUFF 
     ; 
     mov  eaxを終了します 60   ; sys_exit syscall番号:60 
     xor  edi  edi  ; 終了ステータスを0に設定します( `xor edi、edi`は` mov edi、0`と同じです)
     syscall       ; あれを呼べ

OS X64ビットx8664アセンブリ:NASM用

 
グローバル_メイン

セクション.text

_main:
     mov  rax  0x02000001      ; sys_exit syscall番号: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.UndokumentierteEigenschaftenexternerKommandos」。NWDOS-ヒント— Novell DOS 7で実行されるヒントとコツ、Blick auf undokumentierteの詳細、バグと回避策MPDOSTIPリリース157(ドイツ語)(3版)。2016年11月5日にオリジナルからアーカイブされました2012年1月11日取得(NB。は、 Novell DOS7とOpenDOS7.01NWDOSTIP.TXTに関する包括的な作業であり、文書化されていない多くの機能と内部の説明が含まれています。これは、2001年まで維持され、当時多くのサイトで配布された、著者のさらに大きなコレクションの一部です。提供されたリンクHTMLに変換された古いバージョンのファイルを指します。)[1]MPDOSTIP.ZIP

外部リンク