シェア平和を参照するには単語の知識、お互いを励ます:学習サイクルが分割された学習、思考、実際、訂正学習の効率が高い4段、短い期間、。
Linuxは、この構造は、実行中のプロセスに基本的な情報を説明しtask_struct構造。プロセスです。次に、私が練習セッションでプロセス制御、について何かを言います。
1.プロセスの作成
まず、機能紹介:pid_tフォーク(ボイド); 戻り値:子が0親が子プロセスIDを返し、サブプロセスを作成すると、失敗するか-1
プロセスがフォーク呼び出したときに、同じコードが2つのバイナリコードを生成します。そして、それらはすべて同じ場所に実行します。さて、あなたは何を表示するには:
その結果、我々は検証されています:親プロセスがフォークの前に独立して実行し、フォークした後、父と息子の両方を実行フローを実行しました。
フォーク原則:
プロセスがフォークを呼び出した後、制御はカーネルに転送されたときに、カーネルは4つの物事を行います。
1.子プロセスとデータ構造にメモリの新しいブロックを割り当て
2.親データ構造の部分は、子プロセスにコピー
3.システム・プロセス(PCB)リストに子プロセスを追加します。
返す、スケジューリングを開始4.fork
コピー・オン・ライト技術:
実際、フォークは、親プロセスのデータがコピーされたPCB、子プロセスのPCBを作成することである仮想アドレス空間のページテーブルはまったく同じなので、自分のコードとデータが同じように見えるので、この時、親と子、。
しかし、このプロセスは、独立している任意のプロセスデータが他のプロセスに影響を与えるべきではない修正するので、子プロセスは、データを保存するために、独自の物理メモリを開く必要があるはずです。
しかし、子供がデータを変更して、ページ・テーブルを更新するスペースを開けていない場合、それは資源の無駄なので、オペレーティング・システムは、データ・メモリのコピーを開き始めるが、データを変更し、新しいを開くために子供を与えるために、プロセスを待ちません。物理メモリ、---書き込み時にデータのコピー技術をコピーします
多くのシステム上の問題があるため、次に簡単なのvfork ---親と子は、のvforkの仮想アドレス空間を共有し、それが推奨されていません。
子プロセスが終了するまでのvforkの子プロセスは、親プロセスのブロックを実行しています。
2.プロセスが終了します
プロセスの終了時には、保存して終了の理由なので、彼らは、タスクが正常に完了したプロセスを知っています。
プロセスの終了シナリオ:
1.正常終了、正しい結果。
2.正常終了、エラーの結果は、
3.結果を判断するための基準として使用することができない、予期せず終了しました
出口戦略のプロセス:
1.mainの中のリターン;
---; 2. exit関数を呼び出し1と2は、起動する前に、他の作業のリリースを行うには、バッファ最初の面一になっています
3.コール_exit機能; --- 失礼すぐに終了し、すべてのリソースを解放
3.プロセス待機
あなたがしたいので、なぜ?プロセスを待つゾンビを避けます。
子プロセスが終了するが、そうする場合、親が知らないため、子プロセスを作成した後、子プロセスが終了するのを待ってきました。
関数の説明:
ブロッキング:操作が完了するまで、現在の状態が完了していない場合は、操作を完了するために通話を開始するには、その後、待ちます。
通話を開始した後すぐに復帰するかどうか:ブロックし、非ブロックの間の差。
サブプロセスのステータスを取得します:
待って、オペレーティングシステムによって満たされている状態、出力パラメータを持っているのwaitpid。
ステータスは、単にビューの整数、しかしとしてすることはできませんビットマップ、次のように具体的な詳細は以下のとおりです。
テスト検証コード:
コアダンプ記号:コアダンプフラグ
プログラムが異常終了した場合、事後のデバッグを容易にするための情報ストアドプロシージャをスタック (:安全上の問題とスペース占有コアダンプは、通常はデフォルトでオフになっています)
4.プログラムを置き換えます
以前我々は、実際の物理アドレスマッピングコード領域コードセグメントの仮想アドレス空間に応じて、プロセスを実行するためにどのようなコードを知っています。
これは、コードセグメントは、別のプログラムの位置を交換物理メモリ位置コードに仮想アドレスをマッピングした場合、プロセスは、別のプログラムを実行することを意味します。
どのようなものです:コードは、コードマッピング位置を交換することは、他のメモリ領域コードの位置になり、再初期化されたデータセクション
ほとんどの場合、我々は、子プロセスを作成することです:なぜ子プロセスが別のプログラムを実行したり、他のタスクを実行できるようにします
インプリメンテーション:オペレーティングシステムは、インターフェースのセットが交換プログラムを実現することができる提供する、と呼ばれる関数のEXECファミリー
書式#include <unistd.h> int型EXECL(のconst char型*パス、CONSTのchar *のArg、...); // NULL終了後に int型のexeclp(ファイルのconst char型*、constのchar型*のArg、...); int型execle(CONSTのchar *パス、CONSTのchar * GRG、...、CONSTのchar * envpを[]); int型EXECV(CONSTのchar *パス、CONSTのchar *のARGV); // ARGV配列はNULL終了しなければならない (int型execvpのをファイルのchar *のCONST、CONSTのchar * argvの); int型はexecve(CONSTのchar *パス、CONSTするchar * argvの、CONSTのchar * envpを[]); //配列のenvpを端部がNULLである 事実//のみはexecveシステムコール、他の関数が呼び出されはexecve
2.引数
パスは:対応するファイルがどのディレクトリに(私はまた、プログラムがどちらを実行すべきと述べた)ことを示しています。
ファイル:ファイル名のみを記入し、システムはPATHに見つかります。
envpを[]:環境変数を示し、プログラムは、後に独自のセットを置き換えます
3.コマンドの理解
L(リスト):リストを示すパラメータを使用して
V(ベクトル):パラメータは、アレイの形をとります
P(パス):P-自動検索PATH環境変数
E(envpを):彼は(メンテナンス)環境変数設定と(自分が何を設定されている環境変数を、環境変数には、何を最新の手順です)
理論の話そんなに、それを使用する方法を確認するためのテストコードを書く方が良いです。
する#include <unistd.h> int型のmain() { するchar * CONSTのargv [] = { "PS"、 "-ef"、NULL}は、 チャーCONST * envpを[] = {「PATH = / binにします。/ usr / binに"" TERM =コンソール"NULL}; EXECL(" / binに/ PS "" PS "" -ef」、NULL); PATH環境変数のPと//はフルパス記述することなく、使用することができる (のexeclpを"PS"、 "PS"、 "-ef"、NULL); // Eベルト、自分の環境変数を組み立てることが必要である )、NULL、 "PS"、execle( "PS"をenvpを"-ef"; EXECVします( " / binに/ PS "ARGV); //ベルトp、あなたは全体のパス記述することなく、環境変数PATHを使用することができます execvpの(" PSを; ")、ARGVを自分の環境変数を組み立てるために必要と// eは / binが(はexecve" / PS」、ARGV、envpを); 終了(0); }