码迷,mamicode.com
首页 > 系统相关 > 详细

linux fork()

时间:2015-04-21 13:01:58      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

一. linux下C语言可以用fork()建立子进程。
fork函数返回两个值,对于子进程,返回0; 父进程,返回子进程ID. 所以用
if(fork()==0)
      {子进程执行的代码段;}
else
      {父进程执行的代码段;}

 

二. fork()函数的作用:新建一个子进程。
可以这么看,fork的意思就是分支,所以就相当于在当前进程所运行到的位置分一个支流出来,然后,新进程与老进程都是从分叉点开始继续运行(分叉点也就是fork()函数调用处)。

至于fork()函数的返回值:
子进程返回:0
父进程返回:>0的整数(返回子进程ID号)
错误返回:-1

因此,若没有错误,对于:
if(fork()==0)
{block A}
else   //fork()返回不为零,即父进程执行的地方
{block B}
在新进程中block A的内容会被执行,而在老进程中block B会被执行

 

三.  对于刚刚接触Unix/Linux操作系统,在Linux下编写多进程的人来说,fork是最难理解的概念之一:它执行一次却返回两个值。

  首先我们来看下fork函数的原型:

  #i nclude <sys/types.h>

  #i nclude <unistd.h>

  pid_t fork(void);

  返回值:

  负数:如果出错,则fork()返回-1,此时没有创建新的进程。最初的进程仍然运行。

                    fork出错可能有两种原因:(1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。(2)系统内存不足,

                         这时       errno的值被设置为ENOMEM。

  零:在子进程中,fork()返回0

  正数:在负进程中,fork()返回正的子进程的PID

  其次我们来看下如何利用fork创建子进程。

  创建子进程的样板代码如下所示:

  pid_t child;

  if((child = fork())<0)

  /*错误处理*/

  else if(child == 0)

  /*这是新进程*/

  else

  /*这是最初的父进程*/

  fock函数调用一次却返回两次;向父进程返回子进程的ID,向子进程中返回0,

  这是因为父进程可能存在很多过子进程,所以必须通过这个返回的子进程ID来跟踪子进程,

  而子进程只有一个父进程,他的ID可以通过getppid取得。

看这个程序的时候,头脑中必须首先了解一个概念:在语句pid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的代码部分完全相同,将要执行的下一条语句都是pid=fork()之后的那一条语句。( if ( pid>0 )……。)

  两个进程中,原先就存在的那个被称作“父进程”,新出现 的那个被称作“子进程”。父子进程的区别除了进程标志符(process ID)不同外,变量pid的值也不相同,pid存放的是fork的返回值。fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三 种不同的返回值:

 

linux fork()

标签:

原文地址:http://www.cnblogs.com/cj2014/p/4443894.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!