一个进程可以有两个PID吗?

时间:2012-10-18 16:57:36

标签: c fork pid

我正在学习计算机系统,我已经完成了这个非常简单的功能,它使用fork()来创建子进程。 fork()返回pid_t,如果它是子进程,则返回0。但是在此子进程中调用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比父母的pid高,而不是1? main函数的pid与其父元素之间的差异为1,但是当我们创建一个子元素时,它会将pid递增2.为什么会这样?

4 个答案:

答案 0 :(得分:6)

来自fork man页面:

  

返回值

     

成功时,子进程的PID在父进程中返回,   在孩子身上返回0。失败时,返回-1   parent,没有创建子进程,并且正确设置了errno。

Fork不会返回子项的pid,只返回父项的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;
}

答案 1 :(得分:1)

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

除此之外,当你调用fork()时,你正在克隆调用fork的进程,产生完全重复的进程 - 所有文件句柄,所有内存等等。 EXCEPT 的PID。这就是fork返回不同值的原因,具体取决于您是子进程还是父进程。这个不同的返回值使程序知道它是孩子还是父母。孩子得0,因此可以知道这是孩子。

答案 2 :(得分:0)

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

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

通过某些流程的pid,无法就流程关系得出任何结论。

答案 3 :(得分:0)

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