特点:
1、fork函数,调用一次,返回两次;
2、fork和拿书创建一个进程,则fork执行完成后,会有两个进程存在,我们将原来的进程称之为父进程,新进程称之为子进程;
3、fork函数在父进程中返回一次,返回值为子进程的pid(非0值),在子进程中返回一次,返回值为0.
父子进程都是从fork执行完后开始运行。
孤儿进程:父进程结束,但是子进程未结束,子进程称之为孤儿进程。
fork之后,父子进程谁先运行,是不确定的,但是操作系统一般会设置让子进程先运行。
将子进程的ID返回给父进程的理由是:因为一个进程的子进程可以有多个,并且没有一个函数使一个进程可以获得其所有子进程的进程ID。fork使子进程返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getppid以获得其父进程的进程ID。
for(int i=0;i<2;++i)
{
if(fork()==0)
{
printf("A\n");
}
else
{
printf("B\n");
}
}
输出结果为BBABAA。
int glob=10;
int main()
{
int var=10;
int *p=(int*)malloc(4);
*p=10;
int fork();
if(fork()==0)
{
glob=20;
var=20;
*p=20;
printf("child:");
}
else
{
sleep(5);
printf("father:");
}
printf("%d %d %d",glob,var,*p);
}
输出结果为child:glob=20,var=20,*p=20 father:glob=10,var=10,*p=10
1、malloc申请空间,只是申请了虚拟空间上的空间,当使用内存存储数据时,才会给其映射真实的物理内存空间;
2、fork之后,子进程往往跟着执行exec系列函数,所以进程的创建过程采用写时拷贝技术:fork出来的父子进程共享所有的内存空间(除过栈区),内核将这些空间设置为只读的。如果父子进程任意一个进程试图修改其中某些数据时,操作系统会以“页”为单位将修改的数据所在的页拷贝出来;
3、父子进程共享文件。