[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()
呼び出し
生成されたサブプロセス
戻り値
意味
-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()
コード#コード#
#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
Reference
この問題について([OS]プロセスの作成-fork()、exec()), 我々は、より多くの情報をここで見つけました https://velog.io/@alirz-pixel/OS-프로세스-생성-forkテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol