Linux运用fork函数创建进程

fork函数:

函数原型:

pid_t fork(void);

父进程调用fork函数创建一个子进程,子进程的用户区父进程的用户区完全一样,但是内核区不完全一样;如父进程的PID和子进程的PID不一样。

返回值:

RETURN VALUEOn success, the PID of the child process is returned in the parent, and0  is returned in the child.  On failure, -1 is returned in the parent,no child process is created, and errno is set appropriately.

父进程返回的是子进程的PID,这个值大于0。

子进程返回的是0。

注意:一个进程只能返回一个值,父子进程各自返回一个值。

父进程执行pid>0的逻辑,子进程执行pid==0的逻辑;

父子进程谁先执行:谁先抢到cpu时间片,谁先执行。

这是fork.c文件:

通过fork函数创建了一个子进程。

pid也获得了两个值,一个大于零(父进程),一个等于零(子进程)。

两个进程都会执行下面的语句。

父进程执行时,pid>0,会打印出"father:pid==[%d]\n"

子进程执行时,pid=0,会打印出"child:pid==[%d]\n"

在父进程处加sleep(1)是防止父进程比子进程提前结束,让子进程变成孤儿进程。

执行后:

 去掉sleep后有两种结果,一种是子进程先结束:

一种是父进程先结束,子进程变孤儿进程,返回命令句:

如何创建兄弟进程 :

通过以上操作创建的子进程不是全部是兄弟进程,就创建出七个子进程(子进程也会创建子进程)。我们可以添加break;如果是子进程,就跳出循环,不让他创建自己的子进程。

再添加以下操作就可以知道是第几个进程

父进程中i会增到3,所以i==3时是父进程。

完整代码:

#include<stdio.h>2 #include<stdlib.h>3 #include<string.h>4 #include<sys/types.h>5 #include<unistd.h>6 int main()7 {8 9     //pid_t fork(void);10     int i=0;11     for(;i<3;i++)12     {13         pid_t pid=fork();14         if(pid<0)15         {16             perror("fork error");17             return -1;18         }19         else if(pid>0)20         {21             printf("father:pid==[%d],fpid==[%d]\n",getpid(),getppid());22             //sleep(1);23         }24         else if(pid==0)25         {26             printf("child:pid==[%d],fpid==[%d]\n",getpid(),getppid());break;27         }28         //  else if(pid>0)29         //  {30         //      printf("father:pid==[%d]\n",getpid());31         //  }32     }33     if(i==0)34     {35         printf("[%d]----[%d]:child\n",i,getpid());36     }37     if(i==1)38     {39         printf("[%d]----[%d]:child\n",i,getpid());40     }41     if(i==2)42     {43         printf("[%d]----[%d]:child\n",i,getpid());44     }45     if(i==3)46     {47         printf("[%d]----[%d]:father\n",i,getpid());48       }49     return 0;50 }

 结果:

 父子进程不能共享全局变量:

但是父子进程只是对全局变量做读操作,则父子进程在内存中只有一份,属于共享。

但是父子进程中任何一个进程对该全局变量做修改操作,会在内存中拷贝一个副本,然后在这个副本上进行修改,修改完成以后映射回去。--写时复制(拷贝),读时共享

验证:

在pid==0(子进程)时加上sleep(1),是为了避免父进程还没有执行,子进程就已经结束。

结果:

结果发现子进程中val==9,由此当父进程修改val的值时,父子进程不再共享全局变量。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/675989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

压敏电阻简介

压敏电阻 原理 压敏电阻器是一种具有瞬态电压抑制功能的元件&#xff0c;可以用来代替瞬态抑制二极管、齐纳二极管和电容器的组合。压敏电阻器可以对IC及其它设备的电路进行保护&#xff0c;防止因静电放电、浪涌及其它瞬态电流&#xff08;如雷击等&#xff09;而造成对它们…

node网站 宝塔 面板配置 防止刷新404

1.问题 我现在配置了一个网站 后台项目 放到了宝塔上 将相应的域名和项目都配置好了 域名也可以访问 但是有的时候 出现了404 类似这种404 这个资源找不到 2.说明 其实这个问题的原因是nginx 的问题 反向代理的原因 3.解决 在这个配置文件中 有个配置文件 # 防止刷新404l…

前端使用pdf.js进行pdf文件预览的第二种方式:Viewer.html

背景 最近需要实现一个PDF文档预览的功能&#xff0c;按理说&#xff0c;如果只是简单的预览&#xff0c;使用<embed>、<object>等就可以实现。 但是&#xff0c;我们的需求要实现搜索&#xff01;而且&#xff0c;文档还都超大&#xff0c;均300页以上。那<e…

斯巴鲁Subaru EDI需求分析

斯巴鲁Subaru是日本运输集团斯巴鲁公司&#xff08;前身为富士重工&#xff09;的汽车制造部门&#xff0c;以性能而闻名&#xff0c;曾赢得 3 次世界拉力锦标赛和 10 次澳大利亚拉力锦标赛。 斯巴鲁Subaru EDI 需求分析 企业与斯巴鲁Subaru建立EDI连接&#xff0c;首先需要确…

Vue ECharts 散点图上画一个圆形 - 附完整示例

ECharts&#xff1a;一个基于 JavaScript 的开源可视化图表库。 效果 一、介绍 1、官方文档&#xff1a;Apache ECharts Apache EChartsApache ECharts&#xff0c;一款基于JavaScript的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可…

Redis 单线程

文章目录 Redis单线程架构Redis 单线程访问速度IO多路复用原理 Redis单线程架构 Redis的单线程架构的效果为&#xff1a;Redis的单线程是对于服务端而言的&#xff0c;Redis允许多个Redis用户端同时在线操作&#xff0c;但同时只有一个用户端在和服务端交互。多个用户同时发送…

《Git 简易速速上手小册》第5章:高级 Git 技巧(2024 最新版)

文章目录 5.1 交互式暂存5.1.1 基础知识讲解5.1.2 重点案例&#xff1a;为 Python 项目分阶段提交5.1.3 拓展案例 1&#xff1a;细粒度控制更改5.1.4 拓展案例 2&#xff1a;处理遗漏的更改 5.2 使用 Rebase 优化提交历史5.2.1 基础知识讲解5.2.2 重点案例&#xff1a;整理 Pyt…

【工作学习 day04】 9. uniapp 页面和组件的生命周期

问题描述 uniapp常用的有&#xff1a;页面和组件&#xff0c;并且页面和组件各自有各自的生命周期函数&#xff0c;那么在页面/组件请求数据时&#xff0c;是用created呢&#xff0c;还是用onLoad呢&#xff1f; 先说结论: 组件使用组件的生命周期&#xff0c;页面使用页面的…

通俗易懂:快速排序算法全解析

快速排序&#xff08;Quick Sort&#xff09;是一种高效的分治排序算法&#xff0c;它以其出色的性能和广泛的应用而闻名。本文将深入讲解快速排序的原理、步骤和时间复杂度&#xff0c;并探讨其优势和应用场景。 快速排序原理 快速排序的核心思想是通过选择一个基准元素&…

Go语言每日一练——链表篇(四)

传送门 牛客面试笔试必刷101题 ----------------合并两个排序的链表 题目以及解析 题目 解题代码及解析 package main import _"fmt" import . "nc_tools" /** type ListNode struct{* Val int* Next *ListNode* }*//*** 代码中的类名、方法名、参…

【Docker】了解Docker Desktop桌面应用程序,TA是如何管理和运行Docker容器(2)

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

Sqlite3安装步骤

1、Sqlite3以下载文件&#xff0c;配置环境变量的方式进行安装。 2、下方链接为官方的下载地址。 sqlite下载地址 2.1、需要两个下载文件&#xff0c;解压后将他们放在一起&#xff0c;假设解压后的路径为E:\sqlite。 sqlite-dll-win-x64-3450100.zip sqlite-tools-win-x6…

【数据结构】数据结构

本文是基于中国MOOC平台上&#xff0c;华中科技大学的《数据结构》课程和浙江大学的《数据结构》课程所作的一篇课程笔记&#xff0c;便于后期讲行系统性查阅和复习。 从个人感受而言&#xff0c;华中科技大学的课程讲解更适合初学者&#xff08;缺点在于&#xff0c;从概念到…

linux 07 存储管理

02. ext4是一种索引文件系统 上面是索引节点inode&#xff0c;存放数据的元数据 下面是存储块block&#xff0c;主要存放有关的信息 03.linux上的inode 查看文件中的inode ll -i 文件名 磁盘中的inode与文件数量

STM32学习笔记——定时器

目录 一、定时器功能概述 1、基本定时器&#xff08;TIM6&TIM7&#xff09; 工作原理 时序 2、通用计时器&#xff08;TIM2&TIM3&TIM4&TIM5&#xff09; 时钟源 外部时钟源模式1&2 外部时钟源模式2 外部时钟源模式1 定时器的主模式输出 输入捕获…

PySpark(四)PySpark SQL、Catalyst优化器、Spark SQL的执行流程、Spark新特性

目录 PySpark SQL 基础 SparkSession对象 DataFrame入门 DataFrame构建 DataFrame代码风格 DSL SQL SparkSQL Shuffle 分区数目 DataFrame数据写出 Spark UDF Catalyst优化器 Spark SQL的执行流程 Spark新特性 自适应查询(SparkSQL) 动态合并 动态调整Join策略 …

一周学会Django5 Python Web开发-Django5创建项目(用命令方式)

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计11条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

js中new操作符详解

文章目录 一、是什么二、流程三、手写new操作符 一、是什么 在JavaScript中&#xff0c;new操作符用于创建一个给定构造函数的实例对象 例子 function Person(name, age){this.name name;this.age age; } Person.prototype.sayName function () {console.log(this.name) …

编曲学习:旋律创作基础概念 和弦进行作曲 和弦外音使用 作曲技巧

旋律创作基础概念 和弦进行作曲 和弦外音使用 作曲技巧https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_65be1ba7e4b064a83b92a3d7?course_id=course_2XLKtQnQx9GrQHac7OPmHD9tqbv文档https://app8epdhy0u9502.pc.xiaoe-tech.com/p/t_pc/course_pc_detail/camp_pro/cour…

【Larry】英语学习笔记语法篇——从句=连词+简单句

目录 三、从句连词简单句 1、必须有连词 主从结构 疑问词的词性 2、名词性从句 同位语从句 形式主语 形式宾语 that的省略 3、形容词性从句&#xff08;上&#xff09; 关系代词 关系词的作用 介词前置问题 4、形容词性从句&#xff08;中&#xff09; 定语关系…