文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>linux多进程编程

linux多进程编程

时间:2010-11-10  来源:tianchunlong

在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类函数来启动新的进程,这样,原先的进程也在运行,新的进程也在运行了.只不过,区别是,现在的关系变成了父进程和子进程的关系了,而不是原来的同一个进程的关系.  
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载