fork创建进程

  函数原型如下

  #include// 必须引入头文件,使用fork函数的时候,必须包含这个头文件,否则,系统找不到fork函数

  pid_t fork(void); //void代表没有任何形式参数

  父进程与子进程

  1.掌握概念,什么是父进程,什么是子进程

  除了0号进程(系统创建的)之外,linux系统中都是由其他进程创建的。创建新进程的进程,即调用fork函数的进程为父进程,新建的进程为子进程。

  2.fork函数不需要任何参数,对于返回值有三种情况

  1)对于父进程,fork函数返回新建子进程的pid;

  2)对于子进程,fork函数返回 0;

  3)如果出错, fork 函数返回 -1。

  创建进程案例(fork.c)

  #include

  #include

  #include

  int main(void)

  {

  pid_t pid ;

  pid = fork();

  if(pid < 0)

  {

  printf("fail to fork\n");

  exit(1);

  }

  if(pid == 0)

  {

  printf("this is the child,pid is : %u\n",getpid());

  exit(0);

  }

  if(pid > 0)

  {

  printf("this is the parent\n");

  exit(0);

  }

  return 0;

  }

  在shell中编译该程序如下:

  gcc fork.c -o fork

  在shell中运行该程序如下:

  ./fork

  最后输出结果:

  再次运行结果如下:

  父子进程共享资源

  1.父子进程共享代码段(可读的)

  父进程在创建子进程的时候,子进程会把父进程的地址空间里的数据段。和栈堆进行复制,但是没有复制代码段。

  2.详细可看具体代码示例(fork_1.c)

  fork_1.c

  #include

  #include

  #include

  int global; // 全局变量在数据段中

  int main()

  {

  pid_t pid;

  int stack = 1; // 局部变量在栈中

  int * heap;

  heap = (int *)malloc(sizeof(int)); //在堆中

  *heap = 2;

  pid = fork();

  if(pid < 0)

  {

  printf( " fail to fork\n " ) ;

  exit(1) ;

  }

  if( pid == 0 )

  {

  global++ ;

  stack ++ ;

  (*heap)++ ;

  printf ( " the child , data : %d , stack : %d , heap : %d\n", global , stack , * heap ) ;

  exit(0) ;

  }

  sleep(2) ;

  printf("the parent, data : %d, stack : %d, heap : %d\n", global , stack , *heap);

  return 0 ;

  }

  运行结果如下:

  fork函数出错的情况

  1.fork函数返回值为-1即创建失败,有两种情况可能会导致fork 函数出错;

  2.系统中已经有太多的进程存在;

  3.调用fork函数的用户的进程太多。

原文链接:http://www.maiziedu.com/wiki/process/fork/

linux创建进程fork的方法步骤的更多相关文章

  1. [转]❲阮一峰❳Linux 守护进程的启动方法

    ❲阮一峰❳Linux 守护进程的启动方法 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 ...

  2. Linux 命令详解(六)Linux 守护进程的启动方法

    Linux 守护进程的启动方法 http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html

  3. linux创建子进程--fork()方法

    (1)fork()的定义 fork()函数是Unix中派生新进程的唯一方法,声明如下: #include <unistd.h> pid_t fork(void); 我们需要理解的是,调用一 ...

  4. 【操作系统】linux创建子进程--fork()方法

    (1)fork()的定义 fork()函数是Unix中派生新进程的唯一方法,声明如下: #include <unistd.h> pid_t fork(void); 我们需要理解的是,调用一 ...

  5. 创建进程,join方法,进程对象相关属性和方法,僵尸进程和孤儿进程,守护进程,互斥锁

    创建进程 在python中提供了一个multiprocessing模块可以帮助我们使用多进程解决问题.在multiprocessing 模块中有一个类Process. from multiproces ...

  6. 转:Linux创建进程

    转:http://www.cnblogs.com/GT_Andy/archive/2011/06/21/2086129.html 我们都知道,进程就是正在执行的程序.而在Linux中,可以使用一个进程 ...

  7. C语言 进程控制---创建进程fork()函数

    #include "sys/types.h" #include "stdio.h" #include "stdlib.h" #include ...

  8. Linux下进程隐藏的方法及其对抗

    零.背景 在应急响应中,经常碰到ps命令和top命令查不到恶意进程(异常进程)的情况,会对应急响应造成很大的影响.轻则浪费时间,重则排查不出问题,让黑客逍遥法外.所以这篇博客研究学习如何对抗linux ...

  9. linux创建进程和等待进程退出

    在WIN32下,在一个进程里我们可以使用CreateProcess()创建一个进程,然后通过调用WaitForSingleObect(), WaitForMultipleObject()等待进程退出. ...

随机推荐

  1. 获取终端ip地址

    网上找的,记录下 import java.io.*; import java.net.*; import java.util.*; //import org.apache.http.conn.util ...

  2. C++-数据库【1】-C++连接MSSQL数据库

    测试环境—— 系统:Win7 64bit 编译器:VC++ 2015 数据库:MSSQL 2008 R2 #include <Windows.h> #include <stdio.h ...

  3. 帝国CMS如何自动生成sitemap.xml网站地图文件

    登录网站的后台http://你的域名/e/admin/ 进入后台栏目 =>增加自定义页面 =>选择直接页面,页面名称为:网站地图,文件名修改为  ../../sitemap.xml 内容填 ...

  4. 利用Photoshop修改图片以达到投稿要求

    摘自:http://www.dxy.cn/bbs/thread/8602152#8602152 利用Photoshop修改图片以达到投稿要求 软件版本为Photoshop CS V8.0.1(中文版) ...

  5. 【BZOJ1623】 [Usaco2008 Open]Cow Cars 奶牛飞车 贪心

    SB贪心,一开始还想着用二分,看了眼黄学长的blog,发现自己SB了... 最小道路=已选取的奶牛/道路总数. #include <iostream> #include <cstdi ...

  6. 用VB实现SmartQQ机器人

    这里为了便于介绍程序设计的流程,更多以代码形式给出,具体可用火狐浏览器的firebug插件来抓包分析,或者用谷歌浏览器的开发者工具进行抓包.抓包地址是:http://w.qq.com 第一步,是二维码 ...

  7. Torch7 Tensor切片总结

    1.narrow(k,m,n) 这个函数是选中第k维的从m行开始,供选中n行 2.sub(dim1s,dim1e[,dim2s,dim2e,..,dim4s,dim4e]) 功能最强大,可以切任意的一 ...

  8. notepad++崩溃后文件内容变为NUL的解决方法

    毫无疑问,notepad++是一款非常优秀的文本编辑器,但是notepad++有时候会崩溃,之后文件内容就会全部变成NUL 当你打文件看到自己辛辛苦苦的成果全都变成NUL是不是有想哭的感觉?" ...

  9. Linux 下安装中文 ctex 指南

    大家在用 $\LaTeX$ 进行中文排版时相信会遇到不少问题,而$\textbf{ctex}$套装的出现则有效的解决了这一问题,只要安装了$\textbf{ctex}$那么在文中不用进行引用设置就可以 ...

  10. Struts 2的拦截器(Interceptor)总结

     什么是Struts 2拦截器? 从软件构架上来说,拦截器是实现了面向方面编程的组件.它将影响了多个业务对象的公共行为封装到一个个可重用的模块,减少了系统的重复代码,实现功能的高度内聚,确保了业务对象 ...