在linux中,运行的一个进程,会占去linux的三个地方,代码区,堆栈区和数据区.如果同时运行多个相同的程序,他们就会使用相同的代码区,代码区中存放的就程序的代码,但是数据区和堆栈区分别存放的是程序的数据,全局变量和局部变量,因此即使是相同的程序,也不可同时使用相同的数据和堆栈区.
#include
#include
int main()
{
if(fork() == 0)
{
printf("First.\n");
if(fork() == 0)
{
printf("Second.\n");
}
else
{
printf("Third.\n");
}
}
else
{
printf("Fourth.\n");
if(fork() == 0)
{
printf("Fivth.\n");
}
else
{
printf("Sixth.\n");
}
}
}
可以关注下程序的运行结果,以及输出的顺序,并理解为什么是这种输出结果.
fork()函数:
程序调用fork()函数,系统就为新的进程准备了堆栈区,数据区和代码区.系统先让fork()出的进程和原先的进程使用同一个代码区.那么数据区和堆栈区就不能共享了,因此系统会复制一份完全一抹一样的给fork()出的那个进程.这样父进程的所有数据就给了子进程.这样子进程开始运行时,虽然复制了父进程的数据和堆栈,但是数据和堆栈已经分开了,相互之间已经没有影响了.对于父进程,fork()函数返回了子进程的进程号,对于子进程,fork()函数则返回0,因此根据fork()函数的返回值就能知道,程序现在处的位置是在子进程中还是在父进程中.
也就是传说中的,一个函数具有两个返回值,就是指fork()函数.
那么引来一个问题...如何在一个进程中让另外一个进程启动呢..?
在linux中,基本上使用exec类的函数,但是exec类函数的使用有一个特点就是:一旦你使用exec类的函数,原先的进程就废掉了,因为代码段会被新的进程占据,数据区和堆栈区也会被废掉,并产生新的数据区和堆栈区供新的进程使用.唯一没有变的就是进程号,实际上,只有PID是一样的,其他的东西已经物是人非了.对系统而言,还是同一个进程,因为系统只认进程号,而对编程而言,已经完全是一个新的进程了.
那么...又来了...
如果你想继续原先的进程运行,并且同时启动新的进程..要怎么办..?
看上面我给的代码...对了..就是利用fork()函数和exec类的函数搭配使用.
fork()出一个和父进程完全一抹一样的进程,然后再使用exec类函数来启动新的进程,这样,原先的进程也在运行,新的进程也在运行了.只不过,区别是,现在的关系变成了父进程和子进程的关系了,而不是原来的同一个进程的关系.
阅读(1348) | 评论(2) | 转发(0) |