大家知道Linux中创建子进程的一个很好的方法是函数调用fork,但是很多初学者对fork的理解上可能有点困难。我们举个例子来看看fork的用法吧。
        大家用fork的时候记住fork是“分叉”的意思就很好理解了。
        记得初学fork() 函数及遇到这个函数时,总是不能理解fork为什么会这样写,就会分成父子两个进程。
    先看一下fork() 的经典模式
//--------------------------------------------------------begin
int pid=fork();
if(pid < 0){
//失败,一般是该用户的进程数达到限制或者内存被用光了   
........     
}
else if(pid == 0){
//子进程执行的代码
......
}
else{
//父进程执行的代码
.........
}
.........
//-------------------------------------------------------end
(这段代码可能是有点问题的,稍后解释),首先来看fork 的返回值,有三种情况 -1,0,>0
-1: 当然是失败了,也不会分裂成两个进程. 返回0是子进程,返回〉0 是父进程,此时返回的值当然是资进程的pid了。   这里是比较难理解的一个地方,他的可以这样简单的解释: 当进程遇到fork调用时,将此进程整个拷贝一份,即子进程。此时,该进程的返回值被设置为〉0,即刚才 拷贝生成的子进程pid,而在拷贝生成的进程中,将返回值设置为0 。也就是此时已经有两个进程,只有pid的值不同(忽略一起其他的设置)。
     此时,两个进程都从fork开始往下执行,只是pid不同,所以 if ..... else if .... esle 会根据pid不同来执行相应的代码,并不是说某一部分是父进程的代码,某一部分是自进程的代码. 只是一些条件判断而已.所以当fork后,真个代码都会被两个进程执行,只是(fork成功时)子进程中的pid 为零,所以 else if条件成立,其它两个不成立,所以执行else if中的代码.父进程中pid >0的,所以else成立,执行其中的代码.  如果for()k失败,当然是返回-1,此时是没有子进程的.
    现在来看一下,fork返回值,失败,返回-1,linux下系统调用的一半惯例,错误码在errno中. 0 子进程,因为可以通过getpid() 和getppid()获取自己的进程和父进程的pid; >0 ,父进程中,此为fork()的子进程pid,因为进程中没有可以获取自己子进程pid的系统调用。此时就要把返回的pid保存起来,以后用来控制子进程。例如程序退出时调用kill(pid,9)杀死自己的子进程。
   最后我想跟大家说的是,fork之后是父进程先执行还是子进程先执行,这是取决于cpu调用算法的,就是说他们谁先执行都有可能。
本文出自 “厚德载物” 博客,请务必保留此出处http://binux.blog.51cto.com/742827/163234

linux中fork创建进程讲解(转)的更多相关文章

  1. 用 set follow-fork-mode child即可。这是一个 gdb 命令,其目的是告诉 gdb 在目标应用调用fork之后接着调试子进程而不是父进程,因为在 Linux 中fork系统调用成功会返回两次,一次在父进程,一次在子进程

    GDB的那些奇淫技巧 evilpan 收录于 Security  2020-09-13  约 5433 字   预计阅读 11 分钟  709 次阅读  gdb也用了好几年了,虽然称不上骨灰级玩家,但 ...

  2. Linux中fork的秘密

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

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

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

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

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

  5. linux中fork, source和exec的区别

    转:linux中fork, source和exec的区别 shell的命令可以分为内部命令和外部命令. 内部命令是由特殊的文件格式.def实现的,如cd,ls等.而外部命令是通过系统调用或独立程序实现 ...

  6. Linux中的轻量级进程

    在Linux中,轻量级进程可以是进程,也可以是线程.我们所说的线程,在Linux中,其实是轻量级进程之间共享代码段,文件描述符,信号处理,全局变量时: 如果不共享,就是我们所说的进程. 进程是资源管理 ...

  7. Linux中fork()函数的底层实现【转】

    转自:http://blog.csdn.net/duoru_xiong/article/details/76358812 1. fork(),vfork(),clone()的区别 这三个系统调用的底层 ...

  8. (转)如何在Linux中统计一个进程的线程数

    如何在Linux中统计一个进程的线程数 原文:http://os.51cto.com/art/201509/491728.htm 我正在运行一个程序,它在运行时会派生出多个线程.我想知道程序在运行时会 ...

  9. 杀死Linux中的defunct进程(僵尸进程)的方法指南

    杀死Linux中的defunct进程(僵尸进程)的方法指南_LINUX_操作系统_脚本之家https://www.jb51.net/LINUXjishu/457748.html 这样能看到僵尸进程.

随机推荐

  1. Binary Numbers(HDU1390)

    Binary Numbers 点我 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  2. SQL Server 对象

    第一项:重命名对象 execute sp_rename @objname='Nums',@newname ='Numbers',@objtype ='object'; go 这里要特别小心   @ne ...

  3. WIN_2003_SP2.iso VMware 不能进行网络访问的处理

    1.打开IE发现不能上网的问题 ping命令 发现确实是网络不通: 2.关闭虚拟机设置网络适配器 3.ping命令验证是否设置成功 4.打开IE访问百度

  4. Eclipse setting Java code style and codetemplate

    1.open the eclipse tool window First click the Window menu,then check the children's menu which name ...

  5. jquery第三期:js与jquery对象转换

    我们开始进入jquery的学习了,jquery的学习就不那么中规中矩了,我们来看一个和javascript有所区别的地方. <!DOCTYPE html PUBLIC "-//W3C/ ...

  6. UEditor用法

    UEditor是百度的编辑器,界面美观,功能强大,用起来还不错. 详见该链接http://ueditor.baidu.com/ 一.下载 http://ueditor.baidu.com/downlo ...

  7. HDU2054_A == B ?【模拟题】【大数】【水的问题】

    A == B ? Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  8. Linux下如何进行FTP安装与设置

    1. 先用rpm -qa| grep vsftpd命令检查是否已经安装,如果ftp没有安装,使用yum  -y  install vsftpd 安装,(ubuntu 下使用apt-get instal ...

  9. css3文本效果

    CSS3 包含多个新的文本特性. 在本章中,您将学到如下文本属性: 1. text-shadow 2. word-wrap 浏览器支持 Internet Explorer 10.Firefox.Chr ...

  10. asp.net几种<% %>用法

    在asp.net应用程序中,在asp.net页面常用的<%@ %>.<%# %>.<%= %>.在全球化的项目中使用<%$ %>绑定资源项目,在asp. ...