[OS]プロセスの作成-fork()、exec()


プロセスの作成


Unix環境でプロセスを生成する命令は、fork()およびexec()である.
両方のコマンドは、1つのプロセスに別のプロセスを実行させるために使用されます.fork()は、新しいプロセスにメモリを割り当てます.その後、fork()を呼び出すプロセスはPCB情報をすべて新しい空間にコピーし、元のプロセスは既存の操作を継続する.fork()によって生成されたプロセスも、fork()システムプロトコルを実行する行の次の行から実行される.(新しく作成されたプロセスには、元のプロセスと同じコードがあります.)exec()は、fork()のように新しいプロセスにメモリを割り当てるのではなく、exec()呼び出しのプロセスではなくexec()呼び出しのプロセスだけがメモリに残ります.
プロセスの再作成fork()=>(PID別のプロセスの作成)exec()=>PIDを新しいフローに適用し、exec()を呼び出すフローは新しいフローによって上書きされます.

fork


1つのプログラムが実行中にfork()コマンドを実行すると、同時に2つのプログラムに分けて実行されます.
このとき,新しいプログラムを生成するプログラムを親プロセス,生成するプログラムを子プロセスと呼ぶ.すなわち、親プロセスがfork()コマンドを実行すると、親プロセスと同じサブプロセスが生成されます.

整理int fork()


呼び出し
  • fork()プロシージャのコピー
  • を作成する
  • 新しいPCB
  • を作成する
  • PCBは、コピーアドレス空間
  • を指すように初期化する.
  • は、親プロセスへのリソース(現在開いているファイルを含む)
  • に設定する.
  • 親プロセス生成された子プロセスのPID
  • を返す
    生成されたサブプロセス
  • は、ゼロ
  • を返す.
    戻り値
    意味
    -1
    forkコマンドエラー
    0
    サブプロセス
    2つの水.
    親プロセス

    コード#コード#

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/wait.h>
    #include <unistd.h>
    
    int main() 
    {
    	int pid;
        int status;
        
        pid = fork();  // -1 : 에러  |  0 : 자식  |  (양수) : 부모
        if (pid < 0) {
        	// 에러
     	}
        else if (pid == 0) { // 자식 프로세스
        	printf("Child:  %d, Parent: %d\n", getpid(), getppid());
            exit(3);
        }
        else { // 부모 프로세스
        	wait(&status);
            printf("Parent: %d Child: %d\n", getpid(), pid);
            printf("Status: %d", status>>8);
        }
        
        return 0;
    }

    実行結果


    Child : 1708, Parent : 1707
    Parent : 1707 Child : 1708
    Status: 3

    exec()

  • 現在のプロセス停止
  • progのプログラムを現在のプロセスのアドレス空間
  • にロードする.
  • ハードウェアコンテキスト初期化
  • コマンドラインパラメータargvを新しいプログラム
  • に初期化する

    コード#コード#

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/wait.h>
    #include <unistd.h>
    
    int main() 
    {
    	char *cmd = read_command();
        int pid;
        
        if ( (pid=fork()) == 0 ) { // 자식 프로세스
        	exec(cmd); // 불러운 command 실행
        }
        else { // 부모 프로세스
       		wait(pid);
        }
        
        return 0;
    }

    実行結果


    cmdに登録されたプログラムを実行し、プログラムを終了します.
    親プロセスも一緒に終了します.

    リファレンス


    https://chlgpdus921.github.io/operating%20system/Chapter2_Process2/
    https://woochan-autobiography.tistory.com/207