3

私はコンピューター システムを研究しておりfork()、子プロセスの作成に使用するこの非常に単純な関数を作成しました。子プロセスの場合は 0 をfork()返します。pid_tしかし、getpid()この子プロセス内で関数を呼び出すと、ゼロ以外の別の pid が返されます。以下のコードはnewPid、オペレーティング システムではなく、プログラムのコンテキストでのみ意味がありますか? 親のpidに対して測定された相対値にすぎないのでしょうか?

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

void unixError(char* msg)
{
    printf("%s: %s\n", msg, strerror(errno));
    exit(0);
}

pid_t Fork()
{
    pid_t pid;
    if ((pid = fork()) < 0)
        unixError("Fork error");
    return pid;
}


int main(int argc, const char * argv[])
{
    pid_t thisPid, parentPid, newPid;
    int count = 0;
    thisPid = getpid();
    parentPid = getppid();

    printf("thisPid = %d, parent pid = %d\n", thisPid, parentPid);

    if ((newPid = Fork()) == 0) {
        count++;
        printf("I am the child. My pid is %d, my other pid is %d\n", getpid(), newPid);
        exit(0);
    }
    printf("I am the parent. My pid is %d\n", thisPid);
    return 0;
}

出力:

thisPid = 30050, parent pid = 30049
I am the parent. My pid is 30050
I am the child. My pid is 30052, my other pid is 0

最後に、子の pid が親の pid よりも 1 ではなく 2 高いのはなぜですか? メイン関数の pid とその親の差は 1 ですが、子を作成すると pid が 2 ずつ増えます。なぜでしょうか?

4

4 に答える 4

7

フォークマンページから:

戻り値

成功すると、子プロセスのPIDが親に返され、0が子に返されます。失敗すると、親に-1が返され、子プロセスは作成されず、errnoが適切に設定されます。

Forkは子のpidを返しませんが、親のみを返します。したがって、子プロセスには2つのpidがありません。

これを試して

int main(int argc, const char * argv[])
{
    pid_t thisPid, parentPid, newPid;
    int count = 0;
    thisPid = getpid();
    parentPid = getppid();

    printf("thisPid = %d, parent pid = %d\n", thisPid, parentPid);

    if ((newPid = Fork()) == 0) {
        count++;
        printf("I am teh child. My pid is %d\n", getpid());
        exit(0);
    }
    else
       printf("I am the parent. My pid is %d, my child pid is %d\n", thisPid, newPid);
    return 0;
}
于 2012-10-18T17:00:07.697 に答える
1

ピッドはプロセスごとに1つです。プロセスに複数のpidが存在することはありません。OSでプロセスを処理する内部データ構造には、単一のPIDフィールドしかありません。

それを超えて、fork()を呼び出すと、forkを呼び出したプロセスのクローンを作成し、その正確な複製(すべてのファイルハンドル、すべてのメモリなど)を生成します。PIDを除きます。そのため、forkは、子プロセスか親プロセスかに応じて異なる値を返します。この異なる戻り値により、プログラムはそれが子であるか親であるかを知ることができます。子は0を取得するため、それが子であることを知ることができます。

于 2012-10-18T17:00:21.827 に答える
0

いいえ、pidは一度に1つのプロセスにのみ割り当てられます。

プロセスIDは、プロセスに割り当てられるときにルールに従う必要はありません。したがって、子pidが親のpidの増分であるように見える場合、これは幸運です。

特定のプロセスのpidによって、プロセスの関係に関して結論を​​出すことはできません。

于 2012-10-18T16:58:53.157 に答える
0

PID は割り当て時にシーケンシャルではなく (実際には規則には従いません)、1 つのプロセスは一度に 1 つの PID しか持ちません。また、同じ PID を共有する 2 つのプロセスが存在することはありません。

于 2012-10-18T17:01:24.293 に答える