fork()函数创建子进程

这篇具有很好参考价值的文章主要介绍了fork()函数创建子进程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

APUE–fork()函数介绍



一、fork()系统调用介绍

1.fork()创建子进程特点

fork()用于创建子进程,一次调用会有两个返回(return),一次返回给父进程子进程的PID(Process ID),一次返回给子进程,其返回值为0.

  • 返回值=0,子进程在运行
  • 返回值>0,父进程在运行
  • 返回值<0,fork()调用出错

进程获取自己的PID:getpid()
进程获取父进程PID:getppid()
由于一个进程可创建多个子进程,没有函数可以获取其子进程PID

2. 子进程的特点

创建新的子进程成功后,将父进程的文本段、数据段、堆栈都复制一份给子进程,但子进程有自己独立的空间,子进程对这些内存的修改并不会影响父进程空间的相应内存

父、子进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。若要确保让父进程或子进程先执行,则需要程序员在代码中通过进程间通信的机制来实现

子进程继承的东西

  • 进程的资格、用户号(UIDS)和组号(GIDS)
  • 环境变量
  • 内存
  • 打开的文件描述符
  • 执行时关闭标志
  • 信号控制设定
  • nice值(由nice函数设定,进程的优先级,数值小的优先级高)
  • 进程调度类别
  • 进程组号
  • 对话期ID
  • 当前工作目录
  • 根目录
  • 文件方式创建屏蔽字
  • 资源控制
  • 控制终端

子进程独有

  • 进程号
  • 不同的父进程号
  • 自己的文件描述符、目录流的拷贝
  • 资源使用设定为0
  • 不继承父进程的进程、正文、数据和其他锁定内存
  • tms结构中的系统时间
  • 阻塞信号集初始化为空集
  • time_create函数创建的计时器
  • 异步输入和输出
  • 父进程设置的锁

二、代码示例

1.fork()创建子线程

  #include<stdio.h>
  #include<unistd.h>
  #include<string.h>
  #include<errno.h>
   
  int main(int argc, char **argv)
  {
       pid_t       pid;
   
      printf("Parent process PID[%d] start running...\n",getpid() );
  
      pid = fork();	//创建子进程
      if( pid < 0 )	//fork()错误
      {
          printf("fock() create child process failure:%s\n",strerror(errno));
          return -1;
      }
      else if( 0 == pid )		//子进程正在运行
      {
          printf("Child process PID[%d] start running,my parent PID is [%d]\n",          getpid(),getppid());
          return 0;
      }
      else if( pid >0 )	//父进程正在运行
      {
          printf("Parent process PID[%d] continue running,and child process PID is       [%d]\n",getpid(),pid);
          return 0;
      }
  }

2.子进程对内存修改

  #include<stdio.h>
  #include<unistd.h>
  #include<string.h>
  #include<errno.h>
  
  int g_var = 7;
  char g_buf[]="A string write to stdout.\n";
  int main(int argc, char ** argv)
  {
      int     var = 85;
      pid_t   pid;
  
      if( write(STDOUT_FILENO,g_buf,sizeof(g_buf)-1) < 0 )	//将g_buf[]中的内容输出到屏幕上,除\n(换行)外,
      {
          printf("write string to stdout error:%s\n",strerror(errno));
          return -1;
      }
  
      printf("Before fork\n");
  
      if( (pid=fork()) < 0 )		//fork出错
      {
          printf("fork() error:%s\n",strerror(errno));
          return -2;
      }
      else if( 0 == pid )		//子进程正在运行
      {
          printf("Child process PID[%d] running...\n",getpid());
          g_var ++;
          var ++;
      }
      else		//父进程正在运行
      {
          printf("Parent process PID[%d] waiting...\n",getpid());
          sleep(1);	//让子进程先运行
      }
  
      printf("PID=%ld,g_var=%d,var=%d\n",(long)getpid(),g_var,var);
      return 0;
  }

程序执行结果如下:

fork()函数创建子进程文章来源地址https://www.toymoban.com/news/detail-402656.html

到了这里,关于fork()函数创建子进程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • fork函数如何创建进程,exit/_exit函数如何使进程终止的详细分析与代码实现

    🎊【进程通信与并发】专题正在持续更新中,进程,线程,IPC,线程池等的创建原理与运用✨,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 -  ​​​​​​并发与进程通信 🍻欢迎大家  🏹  点赞👍  评论📨  收藏⭐️ 📌个人主页 - 勾栏听曲

    2024年02月05日
    浏览(47)
  • [入门篇]Linux操作系统fork子进程的创建以及进程的状态 超超超详解!!!我不允许有人错过!!!

    目录 0.前言 1.fork()创建子进程讲解 1.1fork()的简单介绍 1.2 创建子进程详解 1.2.1 如何理解fork创建子进程 1.2.2 子进程的PCB以及子进程的代码和数据 1.2.3为什么要共享写时拷贝 1.2.4 什么时候发生写时拷贝 1.3 fork函数返回值详解 1.3.1引入fork返回值的作用 1.3.2 fork返回执行逻辑剖析

    2024年03月21日
    浏览(63)
  • 《Linux操作系统编程》 第六章 Linux中的进程监控: fork函数的使用,以及父子进程间的关系,掌握exec系列函数

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月11日
    浏览(37)
  • 【Linux进程】查看进程&&fork创建进程

    目录 前言  1. 查看进程  2. 通过系统调用创建进程-fork初识 总结          你有没有想过在使用Linux操作系统时,后台运行的程序是如何管理的?在Linux中,进程是一个非常重要的概念。本文将介绍如何查看当前运行的进程,并且讨论如何使用fork创建新的进程。通过了解这些

    2024年01月22日
    浏览(54)
  • 【Linux初阶】fork进程创建 & 进程终止 & 进程等待

     🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:fork进程创建,理解fork返回值和常规用法,进程终止(退出码、退出场景、退出方法、exit),进程等待(wait、waitpid),阻塞等待和非阻塞等待 🚢🚢作者简介:本科在读,计算机海洋

    2024年02月06日
    浏览(52)
  • 【Linux】进程查看|fork函数|进程状态

    🦄 个人主页—— 🎐 开着拖拉机回家_Linux,大数据运维-CSDN博客 🎐✨🍁 🪁🍁🪁🍁🪁🍁🪁🍁 🪁🍁🪁🍁🪁🍁🪁 🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁🪁🍁 感谢点赞和关注 ,每天进步一点点!加油! 目录 一、基本概念 1.1 概念提出 1.2 特征 二、描述进程-PCB 2.1 什么是进程

    2024年02月04日
    浏览(43)
  • Linux:创建进程 -- fork,到底是什么?

     相信大家在初学进程时,对fork函数创建进程一定会有很多的困惑,比如: 1.fork做了什么事情??  2.为什么fork函数会有两个返回值? 3.为什么fork的两个返回值,会给父进程谅回子进程pid,给子进程返回0? 4.fork之后:父子进程谁先运行?? 5.如何理解同一个变量,会有不同的值?? 本

    2024年02月05日
    浏览(37)
  • 头歌(Linux之进程管理一):第2关:进程创建操作-fork

    任务描述 在上一关我们学习如何获取进程的 pid 信息,本关我们将介绍如何编程创建一个新的进程。 本关任务:学会使用 C 语言在 Linux 系统中使用 fork 系统调用创建一个新的进程。 相关知识 在 Linux 系统中创建进程有很多函数可以使用,其中包括了系统调用也包括库函数。

    2024年02月06日
    浏览(59)
  • 【Linux初阶】进程的相关概念 | 进程管理 & 查看进程 & 获取进程标识符 & fork进程创建

     🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:进程的概念,进程管理初识(描述、管理进程),查看进程的基础方法,获取进程标识符(pid、ppid),fork进程创建(分流应用) 🚢🚢作者简介:计算机海洋的新进船长一枚,请多多

    2023年04月27日
    浏览(44)
  • 【TCP/IP】多进程服务器的实现(进阶) - 进程的概念及fork函数

    目录 进程的概念及应用 进程的定义 进程的ID fork函数(进程创建函数)         多进程(以及多线程)是现代计算机网络的精髓。在之前,我们所做的诸如回声服务器、回声客户端、文件收发等都是偏向基础的单进程应用。而经过前面的铺垫,我们对Socket也有了一定了解

    2024年02月09日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包