2. オペレーティング システム - プロセスは他のプログラムを再表示し、終了し、待機します。

目次

1. 他のプログラムを再印刷して実行する (exec)

1.関数実行

 2.コード

3.フォーム

4. 知識ポイント

次に、子プロセスが終了します

1. exit( ) / _exit( ) で終了し、終了値を渡す

2.子プロセスの解放値wait/waitpidで親プロセスをブロックさせて子プロセスの終了値を待ち、ちなみに死体回収

3.コード

4.注意する

三、待機機能

1. 待機の説明

2.子プロセスの終了ステータスを処理するには、次のマクロを使用してさらに分析できます

3.コード

4. 考える

4. 処理状況

1. 他のプログラムを再印刷して実行する (exec)

1.関数実行

 2.コード

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
    // 产生一个子进程
    pid_t pid =  fork( );

    if (pid > 0 ) // 当前为父进程
    {
        printf("我是你 大爷 !!我孙子的ID 是:%d \n" , pid );
    }
    else
    {
        printf("我是你 二大爷 我自己的ID 是:%d  !!\n" , getpid() );
        execlp("cp" , "cp" , "fork-1.c" , "a.c"  , NULL );

    }
    return 0;
}

ファイルがカウントされます

3.フォーム

execl("./num" , "num" , NULL ); // 使用execl 函数进行转载新的可执行文件
execv( "./num" , argv ); // 转载新的可执行文件并运行
execl("/bin/cp" , "cp" , "fork-1.c" , "a.c" , NULL );
execlp("cp" , "cp" , "fork-1.c" , "a.c" , NULL );

4. 知識ポイント

exec 関数が実行された後、プロセスのメモリ空間はどうなりますか? - 新しい実行可能ファイルによって再初期化されます

exec関数が実行された後、スレッドの後ろのステートメントは実行されません

次に、子プロセスが終了します

1. exit( ) / _exit( ) で終了し、終了値を渡す

2.子プロセスの解放値wait/waitpidで親プロセスをブロックさせて子プロセスの終了値を待ち、ちなみに死体回収

3.コード

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
    printf("Hello ") ;
    exit(0);//程序会输出Hello
    _exit(0);//程序不会输出Hello
}

4.注意する

  • ステータスは、プロセスが終了した後にプロセスの本体に保存され、親プロセスが受け入れて解析するのを待つ必要があります
  • プロセスが終了すると、死体が生成され (ゾンビ状態と呼ばれます - メモリを占有します)、親プロセスが処理して死に設定するのを待つ必要があります (メモリを占有しません)。

三、待機機能

1. 待機の説明

2.子プロセスの終了ステータスを処理するには、次のマクロを使用してさらに分析できます

3.コード

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{

    int pid = fork();
    int stat_loc ;

    if ( pid > 0 )
    {
        printf("我是你大爷 你的ID:%d\n" , pid);
        wait(&stat_loc); // 阻塞等待子进程退出
        printf("子进程已经退出...\n");
        if(WIFEXITED(stat_loc))
        {
            printf("子进程正常退出,退出值为:%d\n" , WEXITSTATUS(stat_loc));           
        }
        else if (WIFSIGNALED(stat_loc) )
        {
            printf("子进程异常退出,被信号杀死:%d\n" , WTERMSIG(stat_loc));
            printf("退出值为:%d\n" , WEXITSTATUS(stat_loc));
        }  
    }
    else{
        printf("我是二大爷 我的ID:%d\n" , getpid());
        sleep(1);
        exit(257);
    }
    return 0;
}

4. 考える

子プロセスが終了するときの終了値の値の範囲は?

0 ~ 255 は 8 ビットと 1 バイトを占有します

4. 処理状況

準備完了状態

1. ユーザーまたはその親プロセスによって実行され、fork が正常に呼び出され、共通プロセスが準備完了状態に入る

2.実行されていません

3. 優先順位に従って列に並ぶのが本質

走行状態

1.CPU上で実行

2. 実行中の状態で、タイム スライスが使い果たされると、プロセスは準備完了状態でキューの最後に戻り、再び並んで待機します。

3. 優先度の高いプロセスによって時間がプリエンプトされた場合、プロセスは待機状態のキューの先頭に戻ります。

4. 実行中の状態で、リソースが一時的に利用できない場合、サスペンド/スリープ状態になります

スリープ/サスペンド                           

1. リソースが一時的に利用できない

2. ユーザーが seelp 関数を使用する

3、TASK_INTERRUPIBLE または TASK_UNINTERRUPIBLE

TASK_INTERRUPIBLE ライト スリープ。プロセスはこの状態でシグナルなしでウェイクアップできます (たとえば、ファイルのリソースを待機している場合、リソースが利用可能になると、シグナルが生成されてウェイクアップします)。

4. TASK_UNINTERRUPIBLE は一部のハードウェア、ディープ スリープに関連しており、スリープ中は信号に応答しません。

一時停止状態

1. プロセスは、SIGSTOP または SIGTSTP のいずれかを受け取ると、実行中の状態から一時停止中の状態に変わります。

2. この状態では、システムのスケジューリングに参加しないでください。

3. SIGCONT がシステム プロセスのスケジューリングに再び参加するまで待ちます。

ゾンビ状態

1. プロセスが終了すると (main 関数が return に遭遇するか、exit を呼び出すなど)、プロセスは終了し、ゾンビ状態に入ります。

2. ゾンビ状態の死体には、真偽、終了値/異常終了、終了理由/シグナルキル、シグナル値など、さまざまな状態と終了情報が格納されます。

3. 親プロセスが子プロセスの死体を表示し、その中のデータを取得するのを待ちます

4. 親プロセスが子プロセスの終了情報を正常に取得すると、ゾンビを終了状態に設定します (本当に死にます)。

死亡状態

1. 親プロセスは、プロセスの状態をデッド状態に設定するために、wait( ) / waitpid( ) を呼び出して、子の「死亡情報」を確認する必要があります。

2. 親プロセスが事前にハングアップしていた場合、そのプロセスは親プロセスによって受け入れられ、処理されます (INIT)

おすすめ

転載: blog.csdn.net/weixin_45981798/article/details/129757491