我的代码执行一些代码,具体取决于活动进程是无限循环中的父进程还是子进程:
pid_t childPID;
childPID=fork();
while (1)
{
if (childPID >=0)
{
if (childPID==0)
{
[do child process stuff]
}
else
{
[do parent process stuff]
}
}
else
{
printf("\n Fork failed, quitting!!!!!\n");
return 1;
}
}
代码很简单,但对我来说有一个非常重要的事情,我不明白它是如何发生的,尽管我有猜测:
如果没有考虑到我们正在创建2个进程,那么看起来像childPid一直被重新设置,我认为没有任何意义。
所以我的猜测是,fork为每个进程创建一个childPid,向父进程返回0,向子进程返回pid,即使这个语法让我认为它只应返回一个结果并将其分配给chilPid。
我的猜测是正确还是还涉及其他一些事情?
谢谢。
答案 0 :(得分:2)
所以我的猜测是,fork为每个进程创建一个childPid,向父进程返回0,向子进程返回pid,即使这个语法让我认为它只应返回一个结果并将其分配给chilPid。
正是如此。从fork参考手册:
返回值 成功时,子进程的PID将在父进程中返回,并且 孩子返回0。失败时,在父级中返回-1, 没有创建子进程,并且正确设置了errno。
所以
我的猜测
为什么猜测这是否在POSIX规范中精确定义?
答案 1 :(得分:1)
成功时,子进程的PID在父进程中返回,并在子进程中返回0。失败时,在父项中返回-1,不创建子进程,并正确设置errno
所以childPID在子进程中为0,在父进程中是child的pid
答案 2 :(得分:1)
fork
做的是创建实际进程的新副本作为子进程。
childPID=fork();
在两个进程中都被评估,它返回一个且只返回一个值,诀窍是该值根据执行的进程而不同。在父进程上,它返回新进程(子进程)的PID,并且子进程返回0
,如果fork
没有成功返回子进程-1
永远不会被创造