linux多进程编程

 在linux中,运行的一个进程,会占去linux的三个地方,代码区,堆栈区和数据区.如果同时运行多个相同的程序,他们就会使用相同的代码区,代码区中存放的就程序的代码,但是数据区和堆栈区分别存放的是程序的数据,全局变量和局部变量,因此即使是相同的程序,也不可同时使用相同的数据和堆栈区.

 

#include<stdio.h>

#include<unistd.h>

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类函数来启动新的进程,这样,原先的进程也在运行,新的进程也在运行了.只不过,区别是,现在的关系变成了父进程和子进程的关系了,而不是原来的同一个进程的关系.

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值