我正在学习计算机系统,我已经完成了这个非常简单的功能,它使用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.为什么会这样?
答案 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的进程。