Linux forkとgetpid文の詳細
14444 ワード
プロセスの定義
定義#テイギ#
アプリケーションあるデータセット上の実行アクティビティについて
オペレーティングシステムによるリソース割り当てとスケジューリングの基本単位
プロセスはプログラムの実行プロセスです
プロセスはダイナミックで、プログラムは静的です.
同じプログラムは複数のデータセットで同時に実行され、複数の異なるプロセスに対応します.
各プロセスには独立したアドレス空間があります
アドレス空間には、コードセグメント、データセグメント、スタックセグメントが含まれます.
コードセグメント
データ・セグメント、ストレージ・プログラムのグローバル変数、動的割り当てメモリ
スタックセグメント、関数の実行時のローカル変数の格納
プロセス間のアドレス空間は分離されています
1つのプロセスがクラッシュしても、別のプロセスには影響しません.
プロセスのクラッシュはオペレーティングシステムに影響しません
プロセスのプロパティ
プロセス制御ブロック
オペレーティングシステムは、プロセス制御ブロックと呼ばれる構造体を使用してプロセスの様々な属性を記録する.
プロセスID
プロセスid、各プロセスのidは一意です
親プロセスid
アドレス空間
コードセグメントの開始アドレスと長さ
データ・セグメントの開始アドレスと長さ
スタックセグメントの開始アドレスと長さ
ファイルリストを開く
ファイルを開くと、開いているファイルのリストに開いているファイルの情報が記録されます.
ファイルを閉じるときに、開いているファイルのリストから閉じられているファイルの情報を削除します.
プロセスが終了すると、オペレーティングシステムはファイルリストを開き、まだ閉じていないファイルを閉じます.
getpidプロトタイプ
プロトタイプ
定義#テイギ#
アプリケーションあるデータセット上の実行アクティビティについて
オペレーティングシステムによるリソース割り当てとスケジューリングの基本単位
プロセスはプログラムの実行プロセスです
プロセスはダイナミックで、プログラムは静的です.
同じプログラムは複数のデータセットで同時に実行され、複数の異なるプロセスに対応します.
各プロセスには独立したアドレス空間があります
アドレス空間には、コードセグメント、データセグメント、スタックセグメントが含まれます.
コードセグメント
データ・セグメント、ストレージ・プログラムのグローバル変数、動的割り当てメモリ
スタックセグメント、関数の実行時のローカル変数の格納
プロセス間のアドレス空間は分離されています
1つのプロセスがクラッシュしても、別のプロセスには影響しません.
プロセスのクラッシュはオペレーティングシステムに影響しません
プロセスのプロパティ
プロセス制御ブロック
オペレーティングシステムは、プロセス制御ブロックと呼ばれる構造体を使用してプロセスの様々な属性を記録する.
プロセスID
プロセスid、各プロセスのidは一意です
親プロセスid
アドレス空間
コードセグメントの開始アドレスと長さ
データ・セグメントの開始アドレスと長さ
スタックセグメントの開始アドレスと長さ
ファイルリストを開く
ファイルを開くと、開いているファイルのリストに開いているファイルの情報が記録されます.
ファイルを閉じるときに、開いているファイルのリストから閉じられているファイルの情報を削除します.
プロセスが終了すると、オペレーティングシステムはファイルリストを開き、まだ閉じていないファイルを閉じます.
getpidプロトタイプ
プロトタイプ
#include <sys/types.h> #include <unistd.h> pid_t getpid(void); pid_t getppid(void);
の
getpid のプロセスIDの
getppid プロセスIDの
pid_tはC におけるユーザカスタムタイプ
sys/types.hで
typedef int pid_t;
getpid
プログラム#include <sys/types.h> #include <unistd.h> #include <stdio.h> int main() { printf("pid = %x, ppid = %x
", getpid(), getppid()); return 0; }pid = 4761, ppid = 2570
forkプロトタイプ
プロトタイプ#include <unistd.h> pid_t fork(void);
,、 ,PID
fork , ,fork PIDfork , ,fork 0fork 1#include <stdio.h> #include <unistd.h> int main() { int pid; pid = fork(); if (pid == 0) puts("child"); else puts("parent"); return 0; }
parent child
fork 1
if の2つのブランチが されました
thenブランチ puts(「child」)
elseブランチ puts(「parent」)
これは、 プロセスの によるものです.
サブプロセスif のthenブランチを
プロセスがif を するelseブランチ
fork 2
プログラム#include <stdio.h> #include <unistd.h> int main() { int pid; pid = fork(); if (pid == 0) printf("child: my = %d, parent = %d
", getpid(), getppid()); else printf("parent: my = %d, child = %d
", getpid(), pid); return 0; }parent: my = 6988, child = 6989 child: my = 6989, parent = 6988
fork 2
PID
プロセスのPIDは6988
サブプロセスのPIDは6989
サブプロセスif のthenブランチを
getpid()は、サブプロセスPIDを します.6989
getppid()は、 プロセスPIDを します.6988
したがって、child:my=6989、parent=6988
プロセスがif を するelseブランチ
getppid()は、 プロセスPIDを します.6988
pidはサブプロセスPID-6989
したがって ,parent:my=6988,child=6989