Linuxシステムプログラミングのプロセス
7892 ワード
この間、ファイルI/Oの基本操作の基本操作をまとめましたが、今日は私の理解に従ってlinuxシステムのプログラミングのプロセス操作をまとめ続けます.
まず、プログラム、プロセス、スレッドといういくつかの概念を理解します.
プログラムとは、コンピュータ命令の集合であり、ファイルとしてディスクに格納され、プロセスはプログラム自身のアドレス空間で実行アクティビティである.スレッド
1、概念:
≪プログラム|Program|emdw≫:プログラムは、ファイルとしてディスクに格納されるコンピュータ・コマンドの集合です.
≪プロセス|Process|emdw≫:プロセスは、プログラムが自身のアドレス空間で実行するアクティビティです.
スレッド:プロセス内の実行ユニットであり、プロセス内のスケジューリング可能なエンティティでもあります.
2、連絡:
1、1つのプロセスはプログラムの動的実行であり、プログラムはハードディスクに置かれた静的であり、プロセスはシステムリソースを占有してメモリに動的にロードされる.
2、プロセスはシステムが資源の分配とスケジューリングを行う基本単位であり、オペレーティングシステム構造の基礎である.スレッドスレッドは、軽量プロセスと呼ばれる場合があり、プログラム実行フローの最小ユニットである.
まず、プログラム、プロセス、スレッドといういくつかの概念を理解します.
プログラムとは、コンピュータ命令の集合であり、ファイルとしてディスクに格納され、プロセスはプログラム自身のアドレス空間で実行アクティビティである.スレッド
,
.これを言って皆さんは理解しましたか?いずれにしても私は初めてこの概念を聞いてから見たときに理解して忘れてしまいました.今、私は皆さんに一つの例を挙げて理解してもらいます.みんなドラマを見ましょう.プログラムとは、シナリオです.『西遊記』や『神彫侠侶』などです.たくさんあります.ここではドラマを紹介していません.私たちのテーマに戻って、プログラムはシナリオです.では、プロセスは具体的に撮影されたドラマで、例えば86版「西遊記」は、放送ごとにコンパイルされたプログラムの実行、つまりプロセスです.ある人は言うことができて、それでは私は86版の《西遊記》が好きではありませんて、張紀中版の《西遊記》を見るのが好きで、それではこれは何に対応しますか?これは難しいですね.ブロガーはこの問題についても考えました.ここで私はC言語開発プログラムを使っています.では、Java、pythonを勉強している人がいます.そうでしょう.では、異なる言語で開発されたプログラムは異なるバージョンの「西遊記」に対応しています.私たちは続けます.では、スレッドは何ですか.私たちの『西遊記』には多くのセットがあり、同じ私たちのプロセスも複数のスレッドからなるつまりスレッドです.そう言えば、皆さんは覚えていますか?これを覚えてから、私は彼らの概念と相互の違いを与えました.1、概念:
≪プログラム|Program|emdw≫:プログラムは、ファイルとしてディスクに格納されるコンピュータ・コマンドの集合です.
≪プロセス|Process|emdw≫:プロセスは、プログラムが自身のアドレス空間で実行するアクティビティです.
スレッド:プロセス内の実行ユニットであり、プロセス内のスケジューリング可能なエンティティでもあります.
2、連絡:
1、1つのプロセスはプログラムの動的実行であり、プログラムはハードディスクに置かれた静的であり、プロセスはシステムリソースを占有してメモリに動的にロードされる.
2、プロセスはシステムが資源の分配とスケジューリングを行う基本単位であり、オペレーティングシステム構造の基礎である.スレッドスレッドは、軽量プロセスと呼ばれる場合があり、プログラム実行フローの最小ユニットである.
3、 ; .
4、 , , , , 。
3、
: ; ; ; ;
: ,
, .
.
, , .
, 。
, , , 。
。 、 。 , ,
。
, , 。 , 。
。
, Linux/Unix API。
1、 fork
#include
pid_t fork(void);
fork ,
fork UNIX ( 、init 。 )。 fork ( child process)。 , 。 0, ID。 I D : , ID。fork 0 : , getppid ID ( ID 0 , ID 0)。
API :
#include
#include
int main()
{
pid_t pid;
//fork , , 0, ID,
pid = fork();
if(pid
2、vfork()
vfork , fork ,
1.vfork , exec exit 。 , 。
2.fork ; vfork , exec exit , , , 。
:
#include
#include
#include
int main()
{
pid_t pid = -1;
pid = vfork();
if(pid 0)
{
printf("I am parent
");
}
else
{
sleep(10);
printf("I am child
");
exit(1);
}
return 0;
}
から、サブプロセスの が するたびに プロセスが されることができます.
3、getpid()/getppid()
のプロセスidと プロセスidを します.プロセスidはプロセスを する の です.
ここでは、 なテスト を します.#include
#include
#include
int main()
{
pid_t pid;
//fork , , 0, ID,
pid = fork();
if(pid 0)
{
sleep(1);
printf("I am parent
");
printf("pid = %d
",getpid());
printf("ppid = %d
",getppid());
}
return 0;
}
:
[root@localhost Fork]# ./fork-2
I am Child
pid = 6353
ppid = 6352
I am parent
pid = 6352
ppid = 3674
のシステムAPIに る に、ゾンビプロセス、 プロセス、 のようにゾンビプロセスはサブプロセスです.
プロセス: プロセスが し、その1つ のサブプロセスが されている 、それらのサブプロセスは プロセスになります. プロセスはinitプロセス(プロセス 1)によって され、initプロセスによってステータス が します.
ゾンビプロセス:forkを してサブプロセスを するプロセスです.サブプロセスが し、 プロセスがwaitまたはwaitpidを び してサブプロセスのステータス を していない 、サブプロセスのプロセス はシステムに されます.このプロセスを プロセスと ぶ.
forkで にプロセスを した 、プログラムを した 、サブプロセスと プロセスの には がなく、 に されていたことがわかりました. たちはsleep を って、 プロセスの を することができましたが、この はシステム を し、 プロセスとゾンビプロセスを します.ここでは、 のいくつかのAPI:wait()/waitpid()を します. #include
#include
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
wait() は, び し ,ブロックが のサブプロセスの を つとすぐに る. び しはこのサブプロセスのIDを に し、 び しに して-1を します.wait()とwaitpid のstatusは を し、いくつかのマクロでサブプロセスの をテストします.
wait staus マクロ WIFEXITED(status)プログラムサブプロセスが に した 、ゼロ の WEXITSTATUS(status)を すWIFEXITEDがゼロでない 、 りサブプロセス コードWIFSIGNALED(status)サブプロセスはキャプチャ のために し、ゼロ の WTERMSIG(status)を すWIFSIGNALEDがゼロでない 、 り コードWIFSTOPED(status)プロセスが された 、ゼロ の WSTOPSIG(status)を します.WIFSTOPEDがゼロでない 、 り コード#include
#include
#include
#include
#include
int main()
{
pid_t pid = -1,child_pid = -1;
int status;
pid = fork();
if(pid 0)
{
printf("I am parent
");
printf("child pid = %d
",pid);
child_pid = wait(&status);
printf("wait pid = %d
",child_pid);
//
printf("Exit Status = %d
",WIFEXITED(status));
}
return 0;
}
のコードは、wait() の い 、statusの な い を しています. のマクロの い は ていますが、ここでは のいくつかの い は していません.
waitpid()システム び しの 、
wait との いはwaitpidが のプロセスの のプロトタイプを つために することです:pid_t waitpid(pid_t pid, int *status, int options);パラメータ:statusが でない 、ステータス がその す に き まれますoptionsはwaitpidの を することを します. も つオプションはWNOHANGです.waitpidが び し の に り を けないようにすることです.サブプロセスを つpidに り、 して-1に ります.
がプロセス に する であり, でまとめ け,これらのAPIを な で に いる.