fork函数——多进程编程,其实也不是很难

转载 2007年09月21日 11:54:00

2007-05-22 | fork函数

标签: fork函数  创建进程 
 

fork函数

    linux中,只有一个函数可以创建子进程:fork

     #include <sys/types.h>

     #include <unistd.h>

     pid_t fork(void);

 

    fork创建的新进程被称为子进程( child process)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。将子进程ID返回给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数使一个进程可以获得其所有子进程的进程IDfork使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getppid以获得其父进程的进程ID(进程ID 0总是由交换进程使用,所以一个子进程的进程ID不可能为0 )

    子进程和父进程共享很多资源,除了打开文件之外,很多父进程的其他性质也由子进程继承:

实际用户ID、实际组ID、有效用户ID、有效组ID

添加组ID

进程组ID

对话期ID

控制终端。

设置-用户-ID标志和设置--ID标志。

当前工作目录。

根目录。

文件方式创建屏蔽字。

信号屏蔽和排列。

对任一打开文件描述符的在执行时关闭标志。

环境。

连接的共享存储段。

资源限制。

    父、子进程之间的区别是:

• fork的返回值。

进程ID

不同的父进程ID

子进程的tms_utime,tms_stime,tms_cutime以及tms_ustime设置为0

父进程设置的锁,子进程不继承。

子进程的未决告警被清除。

子进程的未决信号集设置为空集。

    使fork失败的两个主要原因是:( a )系统中已经有了太多的进程(通常意味着某个方面出了问题),或者( b )该实际用户ID的进程总数超过了系统限制。回忆表2 - 7,其中child_max规定了每个实际用户ID在任一时刻可具有的最大进程数。

    fork有两种用法:

(1) 一个父进程希望复制自己,使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的——父进程等待委托者的服务请求。当这种请求到达时,父进程调用fork,使子进程处理此请求。父进程则继续等待下一个服务请求。

(2) 一个进程要执行一个不同的程序。这对shell是常见的情况。在这种情况下,子进程在从fork返回后立即调用exec

 

    我们从一个例子程序中可以看到fork函数的作用,子进程与父进程之间的资源共享。

 

#include <sys/types.h>

#include <stdio.h>

#include <stdlib.h>

 

int glob = 6;

char buf[] = "a write to stdout/n";

 

int main()

{

     int var;

     pid_t pid;

      

     var = 88;

      

      

     fprintf(stderr, "%s", buf);

      

     printf("before fork/n");

      

     if(( pid = fork() ) < 0 )

     {

         fprintf(stderr, "fork error/n");

     }

     else if(pid == 0)

     {

         glob++;

         var++;

         printf("child process/n");

         printf("pid = %d, father pid = %d, glob = %d, var = %d/n", getpid(), getppid(), glob, var);

         exit(0);

     }

     else

     {

         sleep(2);

         printf("father process/n");

         printf("pid = %d, father pid = %d, glob = %d, var = %d/n", getpid(), getppid(), glob, var);

     }

      

      

     return 0;

}

 

当教师其实很为难

绝对不能让学生没学到有用的东西,这是良心问题。  不能让学生的平均分过80,学校的规定,刚刚有老师因为学生的平均分达到84而被通报,这是什么道理呀!  不能让学生有太多的不及格,看着学生去补考,觉得自...
  • subo1973
  • subo1973
  • 2007年05月24日 16:44
  • 293

看什么都很简单的人,很难长进

唉,为什么总是被别人的评价所左右呢?其实有些人,什么都感觉很简单,却其实什么都学不会。2004-10-27 20:36:15 ×××其实你那个统计编成原理也很简单无非就是浏览器信息把,,不过统计功能很...
  • zjyfc
  • zjyfc
  • 2004年10月27日 20:58
  • 488

也不是很难嘛

  • c8958007
  • c8958007
  • 2009年10月24日 16:38
  • 307

[Java]Java MVC 分层概念(转)

Posted on 2015-01-08 13:56 1iqueen 阅读(6255) 评论(2) 编辑 收藏 service是业务层  action层即作为控制器 dao(Data A...
  • konglongaa
  • konglongaa
  • 2016年05月31日 15:49
  • 297

编程选择,多线程or多进程?

转载自:http://blog.csdn.net/lishenglong666/article/details/8557215,感谢博主! 鱼还是熊掌:浅谈多进程多线程的选择 关于多进...
  • wangbin344
  • wangbin344
  • 2015年07月31日 08:09
  • 682

unix多进程编程之fork函数笔记

unix多进程编程之fork函数笔记 运行环境:mac+xcode fork进程介绍fork函数是复制本进程的一个拷贝,生成该进程的子进程。两个进程相同的地方: 和该进程相关联的全部数据(包括变量...
  • qq_15437667
  • qq_15437667
  • 2017年03月29日 01:18
  • 215

IT人为什么难以拿高薪?

古语云:人为财死鸟为食亡。曹雪芹也说过:天下熙熙,皆为利来;天下壤壤,皆为利往。人类发明这种货币方式,那它就可以从侧面衡量一个人的价值,甚至他对社会的影响力。简单的说,你的薪资反映了你对公司或对社会的...
  • conansix
  • conansix
  • 2015年09月19日 14:32
  • 725

其实很难听到

多听听这个世界上不同的声音,往往很走心。                 在一个恋爱群中,偶然听到三五群友在谈论“程序员”,觉得特别有意思,所以记录下来。(俄没有参与,只是聆听)谈论者中有大学生、...
  • aspzhenshuai
  • aspzhenshuai
  • 2015年01月31日 19:05
  • 416

若你喜欢怪人 其实我很美

昔日陈奕迅的歌词里说,为何伦敦总偏爱雨天。 可是,如若我写这个歌词,我会改成,为何伦敦总偏爱冷天。 到了英国,第一个感觉,就是冷。冷到骨髓里。 那种因为潮湿而产生的阵阵阴冷,让我突然觉得莫名的熟...
  • fgdf4
  • fgdf4
  • 2015年06月15日 19:12
  • 103

暑期二 (C)(hdu2043)

原题 密码 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot...
  • u012910051
  • u012910051
  • 2016年06月27日 11:09
  • 143
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:fork函数——多进程编程,其实也不是很难
举报原因:
原因补充:

(最多只允许输入30个字)