Chinaunix首页 | 论坛 | 博客
  • 博客访问: 875827
  • 博文数量: 149
  • 博客积分: 3671
  • 博客等级: 中校
  • 技术积分: 1701
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-03 16:52
文章分类

全部博文(149)

文章存档

2011年(57)

2010年(92)

分类: LINUX

2010-11-10 13:24:24

在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类函数来启动新的进程,这样,原先的进程也在运行,新的进程也在运行了.只不过,区别是,现在的关系变成了父进程和子进程的关系了,而不是原来的同一个进程的关系.
 
阅读(1342) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-11-12 08:38:45

很高兴认识你,看看我的博客中的文章吧,对生活很有好处,下面是一些推荐的链接。 电脑一族必看的科学饮食 http://blog.chinaunix.net/u3/119126/showart_2337806.html 抵御电脑辐射从吃开始 http://blog.chinaunix.net/u3/119126/showart_2337785.html 上班族的五种防病食物 http://blog.chinaunix.net/u3/119126/showart_2337764.html 哪些人群最应该喝酸奶 http://blog.chinaunix.net/u3/119126/showart_2337734.html 计算机族必喝的健康饮料 http://blog.chinaunix.net/u3/119126/showart_2337676.html

chinaunix网友2010-11-10 19:51:23

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com