linuxシステムfork関数を使用してサブプロセスを作成する方法

2711 ワード

linuxはマルチプロセスのシステムであることはよく知られています.しかし、linuxでは、プロセスはどのように作成され、実行されますか?
linuxシステムでプロセスを作成するには、オペレーティングシステムによって作成される方法と、親プロセスによって作成されるプロセス(通常はサブプロセス)の2つがあります.システム呼び出し関数fork()は、新しいプロセスを作成する唯一の方法であり、fork()関数はLinuxシステムの比較的特殊な関数であり、1回の呼び出しには2つの戻り値があります.
fork()関数は、システム呼び出しによって元のプロセスとほぼ同じプロセスを作成します.親プロセスがfork()関数を呼び出すと、データやコードを格納するスペースなど、新しいプロセスにリソースが割り当てられます.その後、元のプロセス(親プロセス)のすべての値を新しい新しいプロセス(サブプロセス)にコピーし、元のプロセスの値と異なる値は少数しかありません.自分をクローンしたことに相当します.
例を見てみましょう
#include 
#include 

int main ()
{
    pid_t fpid;

    fpid = fork();

    if (fpid < 0) {
        printf("error in fork!");
    } else if (fpid == 0) {
        printf("this is child process, pid %d/n",getpid());
    } else {
        printf("this is parent process, pid %d/n",getpid());
    }

    return 0;
}

実行結果:
this is child process, pid 5574
this is parent process, pid 5573

文fpid=fork()の前に、このコードを実行しているプロセスは1つしかありませんが、この文の後、2つのプロセスが実行されているようになります.この2つのプロセスのほとんどは同じで、実行する次の文はif(fpid<0)......
なぜ2つのプロセスのfpidが異なるのか,fork関数の特性に関係している.fork呼び出しの奇妙な点は、1回だけ呼び出されたが、2回戻ることができ、3つの異なる戻り値がある可能性があることです.
1)親プロセスにおいて、forkは新規作成子プロセスのプロセスIDを返す.2)サブプロセスでforkは0を返す.3)エラーが発生した場合、forkは負の値を返します.
fork関数の実行が完了すると、新しいプロセスの作成に成功すると、サブプロセスと親プロセスの2つのプロセスが表示されます.サブプロセスでは、fork関数は0を返し、親プロセスでは、forkは新規作成されたサブプロセスのプロセスIDを返します.forkが返す値で、現在のプロセスがサブプロセスであるか親プロセスであるかを判断できます.
forkエラーには2つの原因がある可能性があります:1)現在のプロセス数がシステムで規定された上限に達している場合、errnoの値がEAGAINに設定されます.2)システムメモリが不足している場合、errnoの値がENOMEMに設定されます.
新しいプロセスの作成に成功した後、システムには2つの基本的に完全に同じプロセスが現れ、この2つのプロセスの実行には一定の前後順序がなく、どのプロセスが先に実行されるかはシステムのプロセススケジューリングポリシーに依存します.
各プロセスには、getpid()関数で取得できるユニークな(互いに異なる)プロセス識別子(process ID)と、親プロセスpidを記録する変数があり、getppid()関数で変数の値を取得できます.
参考資料:1、http://blog.csdn.net/jason314/article/details/5640969 2、http://blog.csdn.net/cywosp/article/details/27316803