首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux进程——进程的创建(fork的原理)

前言:在上一篇文章中,我们已经会使用getpid/getppid函数来查看pid和ppid,本篇文章会介绍第二种查看进程的方法,以及如何创建子进程!...本篇主要内容: 查看进程的第二种方法 创建子进程 系统调用函数fork 在开始前,我先来回顾一下如何获取pid,ppid 进程要想区分就一定会有唯一的标示符,而pid,ppid初始化后就变为内核中的数据...为什么fork会有两个返回值? 为什么fork的两个返回值,会给父进程返回子进程pid,给子进程返回0? fork之后父子进程谁先运行? 如何理解同一个变量会有不同的值? fork干了什么事情?...如何理解同一个变量会有不同的值? 同一个函数有两个返回值是因为fork后两个进程都被调度了,但是同一个变量会有不同的值?该如何理解? 首先我们思考一下,如果我们杀掉子进程,父进程还会存在嘛?...总结 fork函数的内容远不只有这么一点,但是理解这五个问题能快速帮助我们,简单理解这个函数,了解fork的原理!关于如何创建子进程我们就讲到这里! 谢谢大家支持本篇到这里就结束了

30511

进程的创建fork vs vfork

上一篇文章学习了进程的基本概念,以及进程的状态,最后学习了Linux中是如何描述一个进程的。本节来学习Linux中进程是如何创建的,以及fork和vfork的区别。...在大学的时候操作系统课程中我们都学过如何去创建一个进程,是通过fork系统调用命令来创建的。...先说几个关于fork的知识点: fork返回值为-1, 代表创建子进程失败 fork返回值为0,代表子进程创建成功。...并且返回值等于子进程的pid 简单来说就是fork创建子进程成功后,父进程返回子进程的pid,子进程返回0....通过vfork来创建子进程 上面我们学习了使用fork来创建子进程,接下来看下使用vfork来创建子进程,以及两者的区别。

1.1K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux下进程的创建过程分析(_do_fork do_fork详解)--Linux进程的管理与调度(八)

    ,也叫线程,是共享资源的进程) 系统调用 描述 fork fork创造的子进程是父进程的完整副本,复制了父亲进程的资源,包括内存的内容task_struct内容 vfork vfork创建的子进程与父进程共享数据段...,而且由vfork()创建的子进程将先于父进程运行 clone Linux上创建线程一般使用的是pthread库 实际上linux也给我们提供了创建线程的系统调用,就是clone fork, vfork...parent_tidptr和child_tidptr), 用于与线程库通信 创建子进程的流程 _do_fork和早期do_fork的流程 _do_fork和do_fork在进程的复制的时候并没有太大的区别..., 他们就只是在进程tls复制的过程中实现有细微差别 所有进程复制(创建)的fork机制最终都调用了kernel/fork.c中的_do_fork(一个体系结构无关的函数), _do_fork以调用...计算此进程的优先级和其他调度参数,将新的进程加入到进程调度队列并设此进程为可被调度的,以后这个进程可以被进程调度模块调度执行。

    2.6K20

    Linux系统 —— 进程控制系列 - 进程的创建与终止 :fork与exit

    进程创建 1.1 再探fork函数初识 我们之前应该聊过fork函数了,具体可以看看这篇: Linux系统 —— 进程系列 - 进程的概念,PCB与PID和fork_linux top adbd是什么线程...spm=1001.2014.3001.5501今天我们来具体聊一聊fork函数 在linux中fork函数是非常重要的函数,它从已存在进程中创建⼀个新进程。...进程返回⼦进程pid,出错返回 - 1 当进程调用fork函数,当控制转移到内核中的fork代码后,内核应该: 1....写时拷贝,是⼀种延时申请技术,可以提⾼整机内存的使⽤率 2. 进程的退出 1. 代码运行完毕,结果正确 2. 代码运行完毕,结果不正确 3....答案是:父进程关心子进程退出时代码跑完之后为什么结果是不正确的 代码只有0是成功的, 只要是非0那么就是不正确,而不正确的非零数字, 就会代表不同的推出原因:退出码 都是如果是运行异常的话

    5700

    【Linux】进程与可执行程序的关系&&fork创建子进程&&写实拷贝的理解

    二、通过系统调用创建进程 fork:创建子进程 fork之后有两个执行分支,fork之后代码共享,也就是说fork之后的代码父进程和子进程都会执行。下面的5986进程就是bash进程。...原因是fork本身是一个系统调用函数,fork内部本身也会有很多代码的,当fork函数执行到最后return pid的时候,它的核心工作已经做完了,子进程其实已经被创建出来了,return pid也是一条语句...,既然父子进程已经都被创建出来了,那么父子进程当然都可以执行return pid语句咯,所以return pid被执行了两次,所以fork就会返回两次。...创建一个进程的时候,系统中就会多一个进程,当子进程创建时,系统就必须为子进程创建出一个全新的PCB(task_struct),父进程会把自己PCB中很多内容拷贝给子进程的PCB,也就是说,子进程被创建,...进程都有自己的代码和数据,系统创建出来的子进程的PCB默认就会指向父进程的代码和数据,想让父子进程分别执行不同的程序,那就可以在代码中根据父子进程fork返回值的不同设置ifelse语句,让父子进程分别执行不同的代码

    19610

    如何正确的创建和销毁 Java 对象?

    简而言之,当新对象被创建,JVM就会自动为这些新创建的对象分配内存。于是,当这些对象没有任何引用的时候,他们就会被销毁并且他们所占用的内存就会被回收。...大多数开发者曾经相信在Java中创建对象是很慢的并且应该尽可能地避免新对象的实例化。 实际上,这并不成立:在Java中创建对象的开销非常的小并且很快。...虽然如此,但是没有必要创建生命周期比较长的对象,因为创建过多的长寿命对象最终可能会填满老年代空间从而引发stop-the-world的垃圾回收,这样的话开销就会比较大。...思想就是如此简单,然而单例模式引发了很多关于如何使之正确的讨论,特别是线程安全的讨论。...基本来说,它所代表的是无实例( non-instantiable)类(构造器被定义成private),仅仅可以选择将方法定义成final(后续会介绍如何定义类)或者static。

    2.3K30

    如何正确的创建和销毁 Java 对象?

    简而言之,当新对象被创建,JVM就会自动为这些新创建的对象分配内存。于是,当这些对象没有任何引用的时候,他们就会被销毁并且他们所占用的内存就会被回收。...大多数开发者曾经相信在Java中创建对象是很慢的并且应该尽可能地避免新对象的实例化。 实际上,这并不成立:在Java中创建对象的开销非常的小并且很快。...思想就是如此简单,然而单例模式引发了很多关于如何使之正确的讨论,特别是线程安全的讨论。...基本来说,它所代表的是无实例( non-instantiable)类(构造器被定义成private),仅仅可以选择将方法定义成final(后续会介绍如何定义类)或者static。...工作 3 年的同事不知道如何回滚代码! 23 种设计模式实战(很全) Spring Boot 保护敏感配置的 4 种方法! 再见单身狗!

    1.9K10

    如何正确的创建和销毁 Java 对象

    简而言之,当新对象被创建,JVM 就会自动为这些新创建的对象分配内存。于是,当这些对象没有任何引用的时候,他们就会被销毁并且他们所占用的内存就会被回收。...大多数开发者曾经相信在 Java 中创建对象是很慢的并且应该尽可能地避免新对象的实例化。 实际上,这并不成立:在 Java 中创建对象的开销非常的小并且很快。...虽然如此,但是没有必要创建生命周期比较长的对象,因为创建过多的长寿命对象最终可能会填满老年代空间从而引发 stop-the-world 的垃圾回收,这样的话开销就会比较大。...思想就是如此简单,然而单例模式引发了很多关于如何使之正确的讨论,特别是线程安全的讨论。...基本来说,它所代表的是无实例( non-instantiable)类(构造器被定义成 private),仅仅可以选择将方法定义成 final(后续会介绍如何定义类)或者 static。

    2.9K40

    如何正确的创建和销毁Java对象

    简而言之,当新对象被创建,JVM就会自动为这些新创建的对象分配内存。于是,当这些对象没有任何引用的时候,他们就会被销毁并且他们所占用的内存就会被回收。...大多数开发者曾经相信在Java中创建对象是很慢的并且应该尽可能地避免新对象的实例化。 实际上,这并不成立:在Java中创建对象的开销非常的小并且很快。...虽然如此,但是没有必要创建生命周期比较长的对象,因为创建过多的长寿命对象最终可能会填满老年代空间从而引发stop-the-world的垃圾回收,这样的话开销就会比较大。...思想就是如此简单,然而单例模式引发了很多关于如何使之正确的讨论,特别是线程安全的讨论。...基本来说,它所代表的是无实例( non-instantiable)类(构造器被定义成private),仅仅可以选择将方法定义成final(后续会介绍如何定义类)或者static。

    1.4K20

    如何获得对云计算的正确控制

    总而言之,这意味着将业务迁移到云端,企业需要对如何控制数据具有新的展望,并更好地了解云计算服务提供商为确保安全性所做的工作,以便放弃其底层平台的所有权。...因此,企业信息安全和风险管理领导者需要采用间接控制的新方法来提高效率和安全性,最重要的是让人高枕无忧。考虑到这一点,人们将会尝试定义如何对云计算进行正确的控制。...设计正确的身份和访问管理策略 安全团队和开发人员可以发现难以掌握基于云计算的控制概念。...与超大规模云计算提供商签订的合同往往绝大多数都会保护这些云计算服务提供商,但是可以与一些云计算服务提供商合作,就更有利于客户的条款达成协议。...总而言之,随着安全风险和合规性法规的不断增加,以及云计算服务的采用,理解云计算安全方面的共同责任非常重要。 在云中放弃和维护控制之间取得适当的平衡,将使企业能够安全地利用云计算服务的诸多优势。

    1.3K00

    Linux进程是如何创建出来的?

    在这篇文章中,我会用 Nginx 创建 worker 进程的例子作为引入,然后带大家了解一些进程的数据结构 task_struct,最后再带大家看一下 fork 执行的过程。...我们展开今天的拆解! 一、Nginx 之 fork 创建 worker 在 Linux 进程的创建中,最核心的就是 fork 系统调用。...不过我们先不着急介绍它,先拿多进程服务中的一个经典例子 - Nginx,来看看他是如何使用 fork 来创建 worker 的。...整个 mm_struct 和地址空间、页表、物理内存的关系如下图。 在内核内存区域,可以通过直接计算得出物理内存地址,并不需要复杂的页表计算。...三、解密 fork 系统调用 前面我们看了 Nginx 使用 fork 来创建 worker 进程,也了解了进程的数据结构 task_struct ,我们再来看看 fork 系统调用的内部逻辑。

    2.1K21

    【Linux】手把手教你制作一个简易shell——(进程创建fork进程替换wait与进程等待exec的应用)(自定义shell程序设计)

    本质是通过 空格 作为分隔符,把一个一个字符串分隔开载入 指针数组中 ; 在父进程bash进程中,创建一个子进程,环境变量也会传递给子进程,并进行 进程等待wait 在子进程中通过...进程替换exec ,执行 指针数组中 中的命令(通过环境变量) ifn的创建子进程 cd就不行。...>模块 1.程序设计框架 我们回顾原理部分: 在父进程bash进程中,创建一个子进程,环境变量也会传递给子进程,并进行 进程等待wait 在子进程中通过 进程替换exec ,执行 指针数组中...中的命令(通过环境变量) 于是我们设计出: fork函数创建子进程 子进程进行进程替换execvp函数,用到 分割usercommand数组后的字符串的地址——的指针数组argv 父进程等待子进程...2.程序设计细节 1. fork函数: 2. execvp函数: 由于我们用到了指针数组argv,所以用exec系列的vp尾缀,execvp , 表示v(vector)数组,p(可以使用环境变量PATH

    14010

    如何为计算机视觉任务选择正确的标注类型

    机器学习中的注释(Annotation)是标记数据的过程,可以是文本,视频,图像或音频等形式。...在计算机视觉任务中,图像注释有助于计算机更好的理解图像,计算机尝试在带注释的数据中学习出适用于新数据识别的相似的规则。...有着以下几种不同类型的标注方式,具体使用那种标注方式还需要根据您的具体任务目标而定。...不同于标注框标注方式,可以框选目标周围不必要区域从而有可能在某些任务中影响模型的训练,多边形标注由于有着较高的标注精度其在任务中可以获得更准确的定位结果。 ?...长方体标注(Cuboid Annotation) 3D长方体标注用于计算目标物体深度的视觉任务,如车辆,建筑物甚至人类,从而获得其总体积。它主要用于建筑和自动驾驶车辆系统领域。 ?

    1.4K30

    什么是线程和进程?是如何创建、同步、通信、销毁的?

    计算机系统中,线程和进程是两个基本的概念。多线程编程已经成为现代编程中比较常见的技术,因此对于线程和进程的深刻理解变得尤为重要。...本文将详细介绍线程和进程,包括定义、创建、同步、通信、销毁等方面的内容,并通过实例帮助读者更好地了解这两个概念。线程定义线程(Thread)是指在单个程序中同时执行的一段指令流或执行流程。...进程定义进程(Process)是计算机中的一个程序关于某个数据集合上的一次运行活动。一个进程可以包含多个线程,每个线程可以执行不同的任务。...在 Java 中,一个进程通常由多个线程组成,可以使用 java.lang.ProcessBuilder 类来创建和控制进程。...创建进程Java 中可以使用 java.lang.ProcessBuilder 类来创建和控制进程。

    45800

    一日一技:MongoDB如何正确中断正在创建的索引

    直到索引创建完成为止。如果使用的是后台索引,那么创建索引的过程不会影响数据写入。 但有时候,本来想创建后台索引,却忘记加 background=True参数。此时怎么办?...因为大集合创建索引有时候可能需要好几个小时,挂起的写入数据会堆积在内存里面,把内存撑爆。 此时,千万不要重启 MongoDB,因为重启以后,之前没有完成的索引创建操作,依然会自动启动继续创建。...正确的做法是杀掉创建索引的进程。 此时,我们可以在 MongoDB Shell 或者 Robo 3T里面操作。 这里以 Robo 3T为例,首先打开对应的集合,如下图所示: ?...然后把命令栏里面的内容修改为: db.currentOp() 返回的内容如下图所示: ? 创建索引的进程,可以在参数里面看到类似于 "lockType": "write" 这样的字字段。...然后在命令栏输入命令: db.killOp(opid) 杀掉进程。 然后重新创建后台索引即可。

    1.7K20

    关于如何用rand(),srand()和time()函数创建简单的随机数

    1随机数的创建 需要rand()函数来创建,这个函数可以返回整形随机数,但是需要一个种子,如果没有就是rand()括号里的内容。...但是和创建主函数如果不填参数main()一样,rand()里如果不填默认是填1,也就是种子1。每一个种子都可以返回特定且唯一的随机数。...如: 无论我运行多少次这个结果都是相同的,第一行是41,第二行是18467,第三行是6334, 这样一次还好多了就不行了,因为我们目的是获得每一次都不一样的随机数,这时候我们需要改种子,之所以每次结果是一样的是因为我们没有在规定...NULL也是空的意思。加上这一条件我们就可以提前修改种子啦! 这时候我们再运行 这样就得到了与一开始不一样的三个随机数了,如果再运行一次会再得到三个不同的随机数。这样就实现了随机数的生成了。...4这个靠rand()函数实现的随机数有极限的,最大是32767。 免责声明:先声明博主是一个刚开始学c的小菜鸟,希望发文章和大家交流,如果有错的希望大家指出,我改正。同时我也会检查更新的。

    10810

    Apache Flink 如何正确处理实时计算场景中的乱序数据

    本文主要介绍 Flink 的时间概念、窗口计算以及 Flink 是如何处理窗口中的乱序数据。...流式计算最终的目的是去统计数据产生汇总结果的,而在无界数据集上,如果做一个全局的窗口统计,是不现实的。 只有去划定一定大小的窗口范围去做计算,才能最终汇总到下游的系统中,用来分析和展示。...(在数据记录中指定即可) 接入的数据,何时可以触发统计计算 ?...(窗口 11:00 ~ 11:10 的数据全部被接收完) 有序事件 假设在完美的条件下,数据都是严格有序,那么此时,流式计算引擎是可以正确计算出每个窗口的数据的 611106-20201206105643182...611106-20201206105644774-1954287544.png 四、Flink 1.11 版本 中,如何定义水印 所以在 1.11 版本中,重构了水印生成接口。

    98240

    Apache Flink 如何正确处理实时计算场景中的乱序数据

    本文主要介绍 Flink 的时间概念、窗口计算以及 Flink 是如何处理窗口中的乱序数据。...流式计算最终的目的是去统计数据产生汇总结果的,而在无界数据集上,如果做一个全局的窗口统计,是不现实的。 只有去划定一定大小的窗口范围去做计算,才能最终汇总到下游的系统中,用来分析和展示。 ?...在 Flink 进行窗口计算的时候,需要去知道两个核心的信息: 每个 Element 的 EventTime 时间戳?(在数据记录中指定即可) 接入的数据,何时可以触发统计计算 ?...(窗口 11:00 ~ 11:10 的数据全部被接收完) 有序事件 假设在完美的条件下,数据都是严格有序,那么此时,流式计算引擎是可以正确计算出每个窗口的数据的 ?...四、Flink 1.11 版本 中,如何定义水印 所以在 1.11 版本中,重构了水印生成接口。新版本中,主要通过 WatermarkStrategy 类,来使用不同的策略生成水印。

    1.4K10

    Python | 面试必问,线程与进程的区别,Python中如何创建多线程?

    今天是Python专题第20篇文章,我们来聊聊Python当中的多线程。 其实关于元类还有很多种用法,比如说如何在元类当中设置参数啦,以及一些规约的用法等等。...首先说进程,进程可以看成是CPU执行的具体的任务。在操作系统当中,由于CPU的运行速度非常快,要比计算机当中的其他设备要快得多。...为了提升计算机的运行效率,把机器的技能尽可能压榨出来,CPU是轮询工作的。也就是说它一次只执行一个任务,执行一小段碎片时间之后立即切换,去执行其他任务。...这是因为默认情况下我们创建的都是用户级线程,对于进程而言,会等待所有用户级线程执行结束之后才退出。...总结 在今天的文章当中,我们一起简单了解了操作系统当中线程和进程的概念,以及Python当中如何创建一个线程,以及关于创建线程之后的相关使用。

    1.1K20
    领券