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;

}

 

掌握 Dojo 工具包,第 5 部分: Dojo 的 UI 组件库 - Dijit

Dijit 简介 从 Dojo 0.9 开始,Dojo 把 Widget 从 Dojo 的核心包中分离出来,组成 Dijit 。 Dojo 在 Dijit 中为 Widget 家族添加了多位成员,增强...
  • joyous
  • joyous
  • 2016年04月23日 03:42
  • 1979

Linux下的多进程编程——fork(),exec()等函数的使用

Linux下的多进程编程初步 1 引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值。fork函数是Unix系统最杰出的成就...
  • hq0520
  • hq0520
  • 2011年05月23日 11:02
  • 2677

Linux多进程之fork()和vfork()函数的对比

转载自:http://www.linuxdiyf.com/bbs/viewthread.php?tid=37653 在fork之后,子进程和父进程都会继续执行fork调用之后的指令。子进程是父进...

深入浅出--UNIX多进程编程之fork()函数

0前言 上周都在看都在学习unix环境高级编程的第八章——进程控制。也就是这一章中,让我理解了unix中一些进程的原理。下面我就主要按照进程中最重要的三个函数来进行讲解。让大家通过阅读这一篇文章彻底...
  • xb_0916
  • xb_0916
  • 2013年06月07日 15:10
  • 328

Linux多进程——利用fork()函数进行多进程编程

fork()函数是Linux系统中唯一可以创建一个新进程的方法。其新创建的进程称为子进程,原进程称为父进程。子进程将从父进程处继承了整个父进程的地址空间(包括进程上下文、代码段、进程堆栈、内存信息、打...

Linux多进程之fork()函数

fork()函数通过复制调用进程来创建一个新的进程。 格式为: #include pid_t fork(void); 返回值类型: 若调用失败,返回值为0; 若调用成功,返回给父进程以子...

深入浅出--UNIX多进程编程之fork()函数

http://blog.csdn.net/wallwind/article/details/6996004 0前言 上周都在看都在学习unix环境高级编程的第八章——进程控制。也就是这一章中,...

linux下通过调用fork函数实现多进程

#include #include #include #include int main(void){ pid_t pid = fork(); if(!pid){ printf(...

深入浅出--UNIX多进程编程之fork()函数

0前言 上周都在看都在学习unix环境高级编程的第八章——进程控制。也就是这一章中,让我理解了unix中一些进程的原理。下面我就主要按照进程中最重要的三个函数来进行讲解。让大家通过阅读这一篇文章...

多进程函数系列fork(), wait(), exec()系列,system(), posix_spawn()实例详解

多进程函数系列fork(), wait(), exec()系列,system(), posix_spawn()实例详解
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:fork函数——多进程编程,其实也不是很难
举报原因:
原因补充:

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