linux创建进程fork的方法步骤

  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/

时间: 2025-01-12 14:23:12

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

转:linux守护进程的启动方法

Linux 守护进程的启动方法 作者: 阮一峰 日期: 2016年2月28日 "守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 Web应用写好后,下一件事就是启动,让它一直在后台运行. 这并不容易.举例来说,下面是一个最简单的Node应用server.js,只有6行. var http = require('http'); http.createServer(function(req, res)

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

(1)fork()的定义 fork()函数是Unix中派生新进程的唯一方法,声明如下: #include <unistd.h> pid_t fork(void); 我们需要理解的是,调用一次fork()方法,该方法会返回两次.一次是在调用进程(也就是派生出的子进程的父进程)中返回一次,返回值是新派生的进程的进程ID.一次是在子进程中返回,返回值是0,代表当前进程为子进程.如果返回值为-1的话,则代表在派生新进程的过程中出错. 那么在程序中,我们就可以根据此返回值来判断当前进程是父进程还是子进程

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

(1)fork()的定义 fork()函数是Unix中派生新进程的唯一方法,声明如下: [cpp] view plaincopy #include <unistd.h> pid_t fork(void); 我们需要理解的是,调用一次fork()方法,该方法会返回两次.一次是在调用进程(也就是派生出的子进程的父进程)中返回一次,返回值是新派生的进程的进程ID.一次是在子进程中返回,返回值是0,代表当前进程为子进程.如果返回值为-1的话,则代表在派生新进程的过程中出错. 那么在程序中,我们就可以根

Linux守护进程的启动方法

导读 “守护进程”(daemon)就是一直在后台运行的进程(daemon),通常在系统启动时一同把守护进程启动起来,本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 Web应用写好后,下一件事就是启动,让它一直在后台运行,这并不容易,举例来说,下面是一个最简单的Node应用server.js,只有6行. var http = require('http'); http.createServer(function(req, res) { res.writeHead(200, {'

Linux 守护进程的启动方法

守护进程”(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 Web应用写好后,下一件事就是启动,让它一直在后台运行. 这并不容易.举例来说,下面是一个最简单的Node应用server.js,只有6行. var http = require('http'); http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/p

[阮一峰]Linux 守护进程的启动方法

"守护进程"(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 Web应用写好后,下一件事就是启动,让它一直在后台运行. 这并不容易.举例来说,下面是一个最简单的Node应用server.js,只有6行. var http = require('http'); http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': '

Windows与Linux获取进程集合的方法

Windows: List<String> tasklist=new ArrayList<String>(); try { Process process = Runtime.getRuntime().exec(cmdstr); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); while (in.hasNextLine()) { String p = in.next

操作系统第2次实验报告:创建进程

个人信息 姓名:郑楚杭 学号:201821121009 班级:计算1811 一.实验目的 熟练Linux创建进程fork操作. 二.实验内容 在服务器上用VIM编写一个程序:一个进程创建两个子进程. 查看进程树 查看进程相关信息 三.实验报告 1. 编写程序 2. 打印进程树 编译1的程序并运行: 打印进程树: 3. 解读进程相关信息 (1) ps -ef UID PID PPID C STIME TTY TIME CMD zhengch+ 31795 31794 0 23:29 pts/4 0

笔记整理--Linux守护进程

Linux多进程开发(三)进程创建之守护进程的学习 - _Liang_Happy_Life__Dream - 51CTO技术博客 - Google Chrome (2013/10/11 16:48:27) Linux多进程开发(三)进程创建之守护进程的学习 2013-07-04 17:25:35 标签:守护进程 daemon Linux多进程开发 系统编程 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liam2199.bl