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

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;

}

 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值