为何fork()与getpid()返回的PID不同?附作业代码分析
fork()与getpid()返回值分析及疑问解答
作业要求
假设父进程PID为10,子进程PID为20,指出代码中A、B、C、D行的PID值并解释原因;同时解答为何同一进程环境中fork()与getpid()返回的PID不同。
程序代码
#include <sys/types.h> #include <stdio.h> #include <unistd.h> int main() { pid_t pid, pid1; /* fork a child process */ pid = fork(); if (pid < 0) { /* error occurred */ fprintf(stderr, "Fork Failed\n"); return 1; } else if (pid == 0) { /* child process */ pid1 = getpid(); printf("child: pid = %d\n",pid); /* A */ printf("child: pid1 = %d\n",pid1); /* B */ } else { /* parent process */ pid1 = getpid(); printf("parent: pid = %d\n",pid); /* C */ printf("parent: pid1 = %d\n",pid1); /* D */ wait(NULL); } return 0; }
示例运行结果
parent: pid = 1586
parent: pid1 = 1585
child: pid = 0
child: pid1 = 1586
预期值(父PID=10,子PID=20)及原因分析
- A行(child: pid):值为0
fork()系统调用在子进程中固定返回0,这是内核约定的规则,用来让子进程识别自身的身份。 - B行(child: pid1):值为20
getpid()的作用是返回当前进程自身的PID,这里当前进程是子进程,所以返回子进程的PID 20。 - C行(parent: pid):值为20
fork()在父进程中会返回新创建的子进程的PID,目的是让父进程能跟踪、管理这个子进程。 - D行(parent: pid1):值为10
getpid()返回父进程自身的PID,也就是10。
核心疑问解答:为何同一进程中fork()与getpid()返回值不同?
这是由fork()的设计逻辑直接决定的:
- 在子进程环境中,fork()返回0是内核给子进程的“身份信号”,用来标记它是新创建的子进程;而getpid()返回的是子进程自己的真实PID,两者语义完全不同——一个是fork调用的返回状态,一个是当前进程的唯一标识。
- 在父进程环境中,fork()返回子进程的PID,是为了让父进程能通过这个值操作子进程(比如用wait等待子进程结束);而getpid()返回父进程自身的PID,同样是两个不同用途的返回值。
简单来说,fork()的返回值是用来区分父子进程、传递子进程标识的工具,而getpid()是用来获取当前进程自身PID的函数,两者设计目的不同,所以同一进程中返回值自然不一样。
内容的提问来源于stack exchange,提问作者motaylormo
相关产品推荐
相关产品推荐

