3

我正在研究计算机系统,我制作了这个非常简单的函数,用于fork()创建子进程。如果它是子进程,则fork()返回0。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 2 比父母的高,而不是 1?主函数的 pid 和它的父函数之间的差异是 1,但是当我们创建一个子函数时,它会将 pid 递增 2。这是为什么呢?

4

4 回答 4

7

从叉子手册页:

返回值

成功时,父进程返回子进程的PID,子进程返回0。失败时,在父进程中返回 -1,不创建子进程,并适当设置 errno。

fork 不返回子进程的pid,只在父进程中返回。因此,子进程没有两个 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

Pids 是一个进程。一个进程永远不会有超过 1 个 pid - 在操作系统中处理进程的内部数据结构中只有一个 PID 字段。

除此之外,当您调用 fork() 时,您正在克隆调用 fork 的进程,生成它的完全副本——所有文件句柄、所有内存等。除了它的 PID。这就是为什么 fork 根据您是子进程还是父进程返回不同值的原因。这种不同的返回值让程序知道它是孩子还是父母。孩子得到 0,因此可以知道它是孩子。

于 2012-10-18T17:00:21.827 回答
0

不,一个 pid 一次只分配给一个进程。

进程 ID 在分配给进程时不需要遵循任何规则。因此,如果看起来子 pid 是父 pid 的增量,这只是运气。

通过某些进程的 pid,不可能得出关于进程关系的任何结论。

于 2012-10-18T16:58:53.157 回答
0

PID 在分配时不是连续的(实际上不遵循任何规则),并且一个进程一次只有一个 PID。此外,永远不可能有两个进程共享相同的 PID。

于 2012-10-18T17:01:24.293 回答