我正在探索父进程& UNIX中的子进程概念。我写了这个小代码,认为x no。或进程将被创建。但它创造了一个不同的号码 -C进程fork()
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argv, char *argc[])
{
int i;
pid_t childpid;
for(i=0; i<3; i++)
{
childpid = fork();
if(childpid == -1)
{
perror("Failed to Fork");
return 1;
}
if(childpid == 0)
printf("You are in Child: %ld\n", (long)getpid());
else
printf("You are in Parent: %ld\n", (long)getpid());
}
return 0;
}
OUTPUT:
You are in Parent: 30410
You are in Child: 30411
You are in Parent: 30410
You are in Child: 30412
You are in Parent: 30411
You are in Parent: 30410
You are in Child: 30413
You are in Child: 30414
You are in Parent: 30412
You are in Parent: 30411
You are in Child: 30415
You are in Child: 30416
You are in Parent: 30413
You are in Child: 30417
据我所知,在fork()
情况家长或孩子可能会在执行偏好。这并不困扰我,困扰我的是正在执行的进程的数量。为什么是14?而不是一些2^n的数字,这是如果我们执行fork(); fork(); fork()
即叉子一个接一个地会发生什么。
我错过了什么?
UPDATE:一个更明确 -
的
fork
功能复制父 存储图像,使接收 父的地址空间 副本的新进程。
这是什么意思?是否意味着 -
- 子进程在
fork()
声明后开始执行? - 子进程获取父进程变量的副本?所以如果
x=3
以上的fork,将子进程看到这个x为3吗?
要更新:是的,两个进程从fork返回,这就是主意。在那个时候,它们的内存空间仅在`fork`的返回值上有所不同。 – rlibby 2011-02-15 04:31:45
这意味着它说 - 在fork之后,子进程拥有父进程的内存副本,所以子进程的所有代码和堆栈以及寄存器和变量都与父进程的全部相同,唯一的例外是返回来自fork的值,它存储在childpid中。所以,1和2的答案都是肯定的。 – 2011-02-15 11:52:44