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. 图片采用base64压缩,可以以字符串的形式传送base64给服务端转存为图片

    (function () { var coverImage = document.querySelector('<div id="coverImage">file< ...

  2. MD5加密的Java实现

    在各种应用系统中,如果需要设置账户,那么就会涉及到储存用户账户信息的问题,为了保证所储存账户信息的安全,通常会采用MD5加密的方式来,进行储存.首先,简单得介绍一下,什么是MD5加密. MD5的全称是 ...

  3. BZOJ‘s Usaco 奶牛题集锦

    1230 线段树 1231 状压DP 1232 最小生成树 1527 贪心 1600 打表找规律 1601 最小生成树 1602 prime 1606 DP 1607 筛法 1609 DP 1610 ...

  4. CentOS利用postfix搭建邮件服务器

    之前我用nodemailer通过163邮箱来发送邮件,不过没过几天就一直ETIMEDOUT,不知道什么原因,想着还是自己搭一个来发邮件可能靠谱点(flag?) 安装postfix CentOS 7 自 ...

  5. 【Beta】Daily Scrum Meeting第三次

    1.任务进度 学号 已完成 接下去要做 502 将login改为面向对象,添加php测试:网络请求使用新线程及回调 将ConstantTools改成HashMap:重构相关代码 509 返回教师多行表 ...

  6. 解决Android界面布局添加EditText组件后界面无法预览

    错误报告: Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V Exception details are ...

  7. ubuntu中source insight打不开,报错pagefault的解决方法

    在ubuntu中装了source insight用来看代码. 但用了一段时间后,有一天突然就发现打不开了,打开马上会弹出wine的错误,详细信息里面是什么PageFault 0x0000008之类的, ...

  8. 一鼓作气 博客--第四篇 note4

    1.元祖允许重复数据.只读元组,列表,元祖没有增删改查,比如身份证列表,不允许修改,就存成 元祖. 2. 字典 key-value对 特性: 无顺序 去重 查询速度快,比列表快多了 比list占用内存 ...

  9. 使用CSS3制作三角形小图标

    话不多说,直接写代码,希望能够对大家有所帮助! 1.html代码如下: <a href="#" class="usetohover"> <di ...

  10. java身份证验证

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...