fork函数

    头文件:#include<unistd.h>

  函数原型:pid_t fork( void);(pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中)

  返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1

   函数说明:一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间。LINUX将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。创建新进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。

  举个例子:

  

  

  运行结果:

  

  分析:

  

    fork函数小结:

  1.调用一次,返回两次。

  2.子进程中fork返回0,父进程中fork返回子进程的PID。

   原因是:①在子进程中通过调用getppid可以方便的指导父进程的PID;  

       ②没有一个函数可以使父进程获得其所有子进程的PID。(所以在fork返回时,将子进程的PID直接返回给父进程)

   注:子进程的ID不可能为0,因为PID为0的进程是swapper进程。

  3.父、子进程共享正文段,不共享数据、堆、栈段,子进程获得父进程数据、堆、栈段的副本。

     注:目前,大多数实现并直接复制父进程的数据、堆栈段,而是使用写时复制(Copy-On-Write)技术,在修改这块内存区域时,才会为被修改的数据创建副本。

  4.子进程会获得缓冲区的副本,即fork前进程缓冲区中的数据未被flush掉,则fork后,子进程能够获得父进程缓冲区中的数据。

  5.父进程所有被打开的文件描述符都会被复制到子进程中。

    注:fork之后处理文件描述符通常有两种情况:

    ①父进程等待子进程结束;

    ②父、子进程各自执行不同的正文段(父、子进程各自关闭不需要使用的文件描述符);

  6.fork之后父、子进程的区别:

    ①fork的返回值;

    ②进程ID不同;

    ③父进程也不同;

    ④子进程的tms_utime、tms_stime、tms_cutime和tms_ustime均被设置为0;

    ⑤父进程设置的文件锁不会被子进程继承;

    ⑥子进程的未处理的闹钟被清除;

    ⑦子进程的未处理信号集设置为空集;

  7.fork失败的两个主要原因:

    ①系统中进程数目已经达到上限;

    ②该实际用户的进程总数达到系统限制;

  8.fork的两种用法:

    ①一个进程希望复制自己,使得父、子进程执行不同的代码段。如父进程监听端口,收到消息后,fork出子进程处理消息,父进程仍然负责监听消息。

    ②一个进程需要执行另一个程序。如fork后执行一个shell命令。

linux的fork函数的更多相关文章

  1. Linux环境fork()函数详解

    Linux环境fork()函数详解 引言 先来看一段代码吧, 1 #include <sys/types.h> 2 #include <unistd.h> 3 #include ...

  2. [转帖]Linux下fork函数及pthread函数的总结

    Linux下fork函数及pthread函数的总结 https://blog.csdn.net/wangdd_199326/article/details/76180514 fork Linux多进程 ...

  3. 【转】linux 中fork()函数详解

    在看多线程的时候看到了这个函数,于是学习了下,下面文章写的通俗易懂,于是就开心的看完了,最后还是很愉快的算出了他最后一个问题. linux 中fork()函数详解 一.fork入门知识 一个进程,包括 ...

  4. linux中fork()函数

    man fork: FORK() Linux Programmer's Manual FORK(2) NAME fork - create a child process SYNOPSIS #incl ...

  5. linux中fork函数详解(转)

    add by zhj: 在Linux,创建进程是用fork(),它其实就是拷贝父进程的数据段和其它数据,这相当于C函数调用中的值传递,这是 此后两者的修改都互不影响.因为两者的数据虽相同,但却在不同的 ...

  6. 知识点查缺补漏贴02:Linux环境fork()函数详解

    引言 先来看一段代码吧, #include <sys/types.h> #include <unistd.h> #include <stdio.h> #includ ...

  7. Linux中fork()函数详解(转载)

    linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...

  8. Linux中fork()函数详解(转)

    一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同, ...

  9. linux的fork()函数-进程控制

    进程作为构成系统的基本细胞,不仅是系统中独立活动的实体,而且是独立竞争资源的基本实体.它要经历创建.执行.等待.终止等一系列过程. 一.fork入门知识(转载) 一个进程,包括代码.数据和分配给进程的 ...

随机推荐

  1. 【转】C++的面象对象总结

    转自:http://www.cnblogs.com/icemoon1987/archive/2012/10/01/2709572.html 1. 面向对象:对象.类.继承   2. 构造函数: 类的数 ...

  2. GNU LIBC源代码学习之strcmp

    比較两个字符串 我的代码块 #include <string.h> int my_strcmp(const char* s1,const char * s2) { if((s1==NULL ...

  3. Could not initialize class org.apache.log4j.LogManager 报错

    部署项目的时候,在windows下一切正常,但是在centos下就发生如下错误 Caused by: java.lang.ExceptionInInitializerError at com.dsid ...

  4. lambda显式声明返回值

    10.21 编写一个lambda,捕获一个局部int变量,并递减变量值,直至它变为0.一旦变量变为0,再调用lambda应该不再递减变量.lambda应该返回一个bool值,指出捕获的变量是否为0. ...

  5. Qt之QtScript(一)

    C++和JavaScript相互通信.今天就学习QtScript模块吧. Qt 包含完全集成的 ECMA 标准脚本引擎.Qt Script 集成了 QObject,为脚本提供了 Qt 的信号与槽 (S ...

  6. HD1285(拓扑排序)

    package cn.hncu.dataStruct.search.topSort; import java.util.Scanner; public class Hdu1285 { static S ...

  7. 无法从“object”转换为“string”

    就我在项目中遇到的问题,和大家分享一下“无法从“object”转换为“string” 在把我出错的代码复制上来,  Guid userid = new Guid(Membership.GetUser( ...

  8. javascript源码阅读推荐

    作者:马 岩(Furzoom) (http://www.cnblogs.com/furzoom/)版权声明:本文的版权归作者与博客园共同所有.转载时请在明显地方注明本文的详细链接,未经作者同意请不要删 ...

  9. Ubuntu GNOME 安装日语输入法(收集)

    原网址是:code.duffy.jp/add-japanese-input-to-gnome/ 1)在终端(Ctrl + Alt + t)输入:sudo apt-get install ibus-an ...

  10. SQL语句修改表

    -- 更改字段类型 默认值 alter table 表名 alter column 字段名 类型 ALTER TABLE 表名 add DEFAULT ('修改后的默认值') for 字段名 WITH ...