关闭

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

1252人阅读 评论(0) 收藏 举报

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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:343363次
    • 积分:4117
    • 等级:
    • 排名:第7520名
    • 原创:116篇
    • 转载:37篇
    • 译文:0篇
    • 评论:121条