`
sealbird
  • 浏览: 586601 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

fork函数

    博客分类:
  • C++
阅读更多
引用
在linux中,只有一个函数可以创建子进程:fork。


    #include <sys/types.h>



    #include <unistd.h>



    pid_t fork(void);







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


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

• 实际用户I D、实际组I D、有效用户I D、有效组I D。


• 添加组I D。


• 进程组I D。


• 对话期I D。


• 控制终端。


• 设置-用户- I D标志和设置-组- I D标志。


• 当前工作目录。


• 根目录。


• 文件方式创建屏蔽字。


• 信号屏蔽和排列。


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


• 环境。


• 连接的共享存储段。


• 资源限制。


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


• fork的返回值。


• 进程I D。


• 不同的父进程I D。


• 子进程的t m s _ u t i m e , t m s _ s t i m e , t m s _ c u t i m e以及t m s _ u s t i m e设置为0。


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


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


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


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


       f o r k有两种用法:


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


(2) 一个进程要执行一个不同的程序。这对s h e l l是常见的情况。在这种情况下,子进程在从f o r k返回后立即调用e x e c。






       我们从一个例子程序中可以看到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;



}












本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kunp/archive/2005/04/17/351533.aspx
分享到:
评论

相关推荐

    linux_fork函数

    ### Linux中的`fork()`函数详解 #### 一、`fork()`函数基础介绍 在Linux操作系统中,`fork()`函数是一个非常重要的系统调用,用于创建一个新的进程。这个新进程被称为子进程,而调用`fork()`函数的原进程则称为父...

    创建新进程:fork函数:fork函数干什么? fork函数与vfork函数的区别在哪里?为何在一个fork的子进程分支中使用_exit函数而不使用exit函数?

    创建新进程:fork 函数 fork 函数是 UNIX 统操作系统中用于创建新进程的系统调用。它创建了一个完全相同的子进程副本,并返回一个进程标识符(PID)。fork 函数的返回值在父进程和子进程中不同:在父进程中,返回子...

    fork 函数详解

    fork 函数详解 fork 函数是 Unix 系统中一个非常重要的系统调用,它允许一个进程创建一个新的进程,该新的进程是原来进程的副本。fork 函数的返回值在父进程和子进程中不同,在父进程中返回新创建的子进程的进程 ID...

    fork函数和子函数进程

    ### fork函数和子进程知识点详解 #### 一、引言 在计算机编程中,特别是针对多任务处理领域,进程管理是实现系统并发的关键技术之一。其中,`fork()`函数是Unix/Linux系统中创建新进程的核心手段。通过深入理解`...

    linux内核 do_fork 函数源代码浅析

    ### Linux 内核 do_fork 函数源代码浅析 #### 一、引言 在 Linux 内核中,进程的创建是一项基本且重要的功能。本文将深入剖析 do_fork 函数,它作为核心组件之一,在 Linux 内核中扮演着创建新进程的关键角色。do_...

    演示fork函数的效果

    在"演示fork函数的效果"这个主题中,我们将深入探讨`fork()`的工作原理以及如何使用它。 首先,`fork()`函数的调用会返回两次:一次在父进程中,一次在子进程中。在父进程中,`fork()`返回新创建子进程的进程ID...

    c语言的fork函数笔记

    ### c语言中的`fork()`函数详解 #### 一、引言 `fork()`函数作为操作系统提供的核心系统调用之一,在进程管理和并发编程中扮演着重要角色。本文将深入探讨`fork()`函数的基本概念、工作原理及其在C语言中的具体应用...

    fork函数[归类].pdf

    《深入理解fork函数:进程创建的艺术》 fork函数在软件开发中扮演着至关重要的角色,尤其是在操作系统编程和并发处理中。它是Unix/Linux系统中创建新进程的主要方式。当我们谈论fork时,我们实际上是在讨论如何复制...

    实验二fork函数kkkkkkkkkkkkk

    实验二fork函数kkkkkkkkkkkkk

    fork函数使用

    关于fork函数的介绍,和测试程序,原版fork linux平台

    C语言的fork函数在Linux中的进程操作及相关面试题讲解

    2.fork 函数被调用一次,但返回两次, 两次返回的唯一区别是子进程的返回值是 0, 而父进程的返回值是新子进程的 PID。 3.子进程和父进程继续执行 fork 调用之后的指令。 在上图的存储空间布局中,父子进程只共享正文...

    进程控制 fork函数的使用等

    wait函数允许父进程挂起,直到一个子进程终止或者接收到信号,然后恢复并返回子进程的退出状态。 在实验中,通过fork系统调用,我们可以创建一个新的进程。在创建过程中,父进程会复制自身的内存空间,包括代码、...

    fork函数例程执行过程分析及说明

    `fork()`函数是Linux操作系统中用于创建新进程的关键系统调用。在本文档中,我们将深入探讨`fork()`的工作原理,以及如何通过示例代码理解其执行过程。 首先,让我们来了解一下`fork()`函数的基本概念。`fork()`会...

    linux下fork函数实例

    用fork创建子进程; 回答no执行父进程,yes执行父进程并复制进程的操作;在父进程将str3,str4接至str0中,并输出str0 ;在子进程中,将str1,str2接至str0中,并输出str0

    结合 linux 0.11 源码分析为什么 fork 函数会返回两个值

    在Linux操作系统中,`fork()`函数是一个非常关键的系统调用,它被用来创建一个新的进程——也就是我们常说的子进程。这个过程被称为进程复制,因为子进程会继承父进程的大部分属性,包括打开的文件、内存空间、信号...

    在win系统下模拟linux中的fork()函数执行过程与基础通信过程

    在win系统下模拟linux中的fork()函数执行过程与基础通信过程 备注清晰。

    fork函数的写时拷贝

    fork函数的写时拷贝技术 fork函数是一种用于创建子进程的系统调用,它在创建子进程时,会将父进程的虚拟存储空间复制给子进程的虚拟存储空间。这种机制使得父子进程可以共享文件等资源,但是为了避免多个进程之间的...

    fork函数中的内存复制和共享

    原来刚刚开始做Linux下面的多进程编程的时候,对于下面这段代码感到很奇怪:  #include  #include  #include  #include  #include  #include  #define LEN 2  void err_exit(char*fmt,…);...

    fork()函数

    本文档以ppt形式编写,通过例子,学习fork()函数的应用及用法,适合初学者。

Global site tag (gtag.js) - Google Analytics