首页
学习
活动
专区
圈层
工具
发布

linux中fork()函数详解(原创!!实例讲解)

fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:     1)在父进程中,fork返回新创建子进程的进程ID;     2)在子进程中,fork返回0;    ...在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。...引用一位网友的话来解释fpid的值为什么在父子进程中不同。...每个进程都有一个独特(互不相同)的进程标识符(process ID),可以通过getpid()函数获得,还有一个记录父进程pid的变量,可以通过getppid()函数获得变量的值。  ...fork()对于父进程和子进程的返回值是不同的,按照上面的A&&B和A||B的分支进行画图,可以得出5个分支。 ?

4.4K30

从零开始学Linux进程控制:fork、wait、exec 详解

PS:fork之后,父进程和子进程谁先执行完全由调度器决定. 1.2:fork函数返回值 fork函数为什么要给子进程返回0,给父进程返回子进程的PID?...为什么fork函数有两个返回值 父进程调用fork函数后,为了创建子进程,fork函数内部将会进行一系列操作,包括创建子进程的进程控制块、创建子进程的地址空间、创建子进程对应的页表等等.子进程创建完毕后...,子进程也同样需要执行,这就是fork函数有两个返回值的原因. 1.3:写时拷贝 当子进程刚刚被创建时,子进程和父进程的数据和代码是共享的,即父子进程的代码和数据通过页表映射到物理内存的同一块空间。...用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。...如果调用出错则返回-1 所以exec函数只有出错的返回值而没有成功的返回值。 命名理解 这些函数原型看起来很容易混 , 但只要掌握了规律就很好记。

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

    父子进程的故事:解读Linux中的fork机制

    1.1 通过系统调用接口查看进程PID 获取进程的 PID 需要用到系统调用接口 getpid() ,该函数会返回调用该函数的进程的 PID,返回值类型为 pid_t 。...如下图我们使用 man getpid 指令去查看 getpid 的基础文档: 注意上图中还有一个 getppid 是什么呢?...为什么子进程返回值为 0 简单区分:子进程无需知道自己的 PID 来执行自己的任务,而只需通过返回值 0 知道自己是子进程。...效率和逻辑一致性:如果子进程也返回自己的 PID,会引入额外的复杂性,而且父进程需要一个单独机制区分这些值。 2.3 一个函数是如何做到返回两次的?如何理解?...以下几点解释了为什么同名变量可以存储不同的值: 父子独立运行 fork 返回后,父子进程的执行路径分开。父进程的 id 变量存储的是子进程的 PID,而子进程的 id 变量存储的是 0。

    53100

    【Linux进程控制】二、进程控制——fork()系统调用深度刨析

    1. fork()、getpid()、getppid()函数介绍 1.1 fork()函数介绍 fork()用于创建一个子进程,我们在shell下执行一个命令其实也是通过fork()实现的,fork()...fork()最大的特点就是一次调用,两次返回,两次返回主要是区分父子进程,因为fork()之后将出现两个进程,所以有两个返回值,父进程返回子进程ID,子进程返回0。...函数参数 void 函数返回值 getpid()返回当前进程ID getppid()返回当前进程的父进程ID 2. fork()工作机制 2.1 fork()的实现机制——一次调用两次返回与进程复制 下面通过一个案例来分析...下面对着两点详细分析;第三点,子进程打印的父进程ID和父进程自己打印的ID不同。...要想避免这种情况,只需要根据返回值判断当前为子进程的时候就退出循环即可,也就是把上面代码中注释掉的break放开即可。

    1.8K10

    Go:命名返回值和直接返回值的使用与潜在隐患

    在Go语言中,命名返回值为函数返回值提供了名称,并在函数体的开头为其分配了零值。命名返回值可以简化代码,并在一些特殊情况下提供额外的便利。...命名返回值与直接返回值 以下是两个示例,展示了命名返回值和直接返回值的差异: 使用命名返回值: func sum(a, b int) (result int) { result = a + b...混合使用命名返回值和直接返回值的隐患 如果在使用命名返回值的同时又直接返回了值,可能会产生混淆和不一致的结果。...判断和建议 一致性:在使用命名返回值时,应确保函数体内的返回逻辑一致。如果选择了命名返回值,则整个函数应该沿用这一约定。 可读性:混合使用可能会降低代码的可读性,增加维护的复杂性。...总结 命名返回值是Go语言中的一个有用特性,但混合使用命名返回值和直接返回值可能会带来混淆和隐患。建议在编写函数时保持一致的风格和逻辑,以增强代码的可读性和可维护性。

    1.6K30

    初识Linux下进程

    fork的返回值是pid_t的一种特殊类型,返回值为0时返回到子进程,返回值为子进程pid时,返回到父进程,如果返回值小于0表示错误。也就是说,fork其实有两个返回值。  ...(),getppid(),id); 13 return 0; 14 }   根据实验结果来看,fork之后的返回值确实有两个,返回给父进程子进程的...至于为什么有两个返回值,这里我们说不清,现在只需要记住即可,后面我们会详谈。...进程也是如此,因为子进程有多个,要想父进程准确无误的找到子进程就需要子进程的pid,而子进程只有一个父亲,并不需要返回特殊值。 为什么fork会返回两次呢?   ...也就是说 在return返回之前,子进程已经创建出来了,并且和父进程同时在执行,两个进程返回不同的id值也就能说的过去了! 为什么接收fork的返回值的变量id既等于0,又大于0呢?

    37210

    探索进程控制第一弹(进程终止、进程等待)

    #include pid_t fork(void); 返回值:自进程中返回0,父进程返回子进程id,出错返回-1。...子进程中也有相关管理数据结构也有自己的代码和数据,代码和数据虽然和父进程共享,但是和父进程相互不影响,数据的部分是以写时拷贝时私有,不写时拷贝相当于共享。...当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以开始它们自己的旅程。...fork函数返回值 子进程返回0 父进程返回的是子进程的pid 如何做到有两个返回值? 探索父进程和子进程 文章中有详细解释。 为什么给父进程返回的是子进程的pid,给子进程返回0?...发现返回值是255。

    29610

    进程探秘:从 PCB 到 fork 的核心原理之旅

    父进程 ID(PPID),到通过ps命令和/proc文件系统窥探进程的实时状态;最终聚焦于进程创建的核心系统调用fork,解析它如何 “一分为二” 生成子进程,以及那些看似反直觉的返回值背后的底层逻辑。...子进程执行父进程之后的代码。 在仅创建子进程时,子进程没有自己的代码和数据,因为目前,没有程序新加载。子进程执行父进程之后的代码。 3.2 fork的返回值 fork会有两个返回值。...为什么fork给父子返回各自不同的返回值?...一个父进程可以有多个子进程,父:子=n:1;将子进程的pid返回给父进程方便父进程管理区分不同的子进程,用于标识新创建的子进程; 为什么一个函数会返回两次?...函数 “返回两次” 的本质:进程复制 + 指令指针共享 fork() 的核心是内核为当前进程创建了一个几乎完全相同的副本。 为什么一个变量id==0又>0? 导致 if 与else同时成立?

    17710

    python3--中的进程操作--multiprocess模块

    这个键的用途是为涉及网络连接的底 层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可) 在windows中使用process模块的注意事项  在Windows操作系统中由于没有...为什么会打印两次进程id号?...注释: 1 主进程默认会等待子进程执行完毕之后才会结束 2 主进程和子进程之间的代码是异步执行的 3 为什么主进程要等待子进程结束:回收一些子进程的资源 4 开启一个进程是有时间开销的:操作系统响应开启进程指令...(os.getpid(),os.getppid())     time.sleep(1) if __name__ == '__main__':     print(os.getpid(), os.getppid...让子进程计算一个值,主进程必须得到子进程的值,来计算值 以文件为消息中间件,来完成主进程获取子进程的值 import os from multiprocessing import Process def

    1.5K10

    面试高频考点:传值返回和传引用返回的区别

    func 的返回值是 Date&(引用),不是按值返回。 所以 return d1 / return d2 返回的就是 局部变量本身的别名,不需要拷贝,也就不会走拷贝构造。 为什么会析构两次?...1️⃣ d1 和 d2 都是 func 的局部变量,存在 func 的栈帧里。...2️⃣ if 分支随机选择: return d1; 时,main 拿到 d1 的引用 return d2; 时,main 拿到 d2 的引用 无论你拿到谁的引用,func 一旦返回,d1 和 d2...【场景】 返回一个临时的新对象 局部变量需要返回给调用者 返回结果和内部对象没必要共享(调用者想要自己的拷贝) 【常见例子】 操作符重载(比如 operator+)...总结: 在 C++ 里,传值返回和传引用返回的选择,核心看返回值要不要和原来的对象共享。

    12110

    【Linux】进程控制

    #include pid_t fork(void); //返回值:子进程中返回0,父进程返回子进程id,出错返回-1 进程调用fork,当控制转移到内核中的fork代码后,内核做:...分配新的内存块和内核数据结构给子进程 将父进程部分数据结构内容拷贝至子进程 添加子进程到系统进程列表当中 fork返回,开始调度器调度 当一个进程调用fork之后,就有两个二进制代码相同的进程。...而且它们都运行到相同的地方。但每个进程都将可以 开始它们自己的旅程。 fork 函数返回值 子进程返回0, 父进程返回的是子进程的pid。 为什么父进程返回的是子进程的pid?...返回./myprocess 的退出码,第二个echo ?返回上一个echo 虽然echo $?没有创建子进程,但它是由父进程执行的,所以他也会影响?的值。...不同的非0值,一方面表示失败,另一方面表示失败的原因。 strerror函数会将错误码转成对应的错误描述,如下图; 父进程为什么要得到子进程的退出码呢? 因为要知道子进程的退出情况。

    46010

    进程的概念与基础操作详解

    通过man查看fork(): 返回值为pid_t类型 包含在头文件 获取进程和父进程的标识符 可以通过以下代码获取进程的 PID 和其父进程的 PPID: PID:getpid()...我的pid:%d,我的父进程id:%d\n",getpid(), getppid()); } } 运行结果如下: 在fork()执行后创建了子进程,并且同上文所讲相同,父进程的父进程是bash进程...在子进程中,fork() 返回 0。 创建子进程失败返回-1。 为什么 **fork()** 有两个返回值? 操作系统在执行 fork() 时,会基于当前父进程的状态,创建一个几乎完全相同的子进程。...这就是为什么返回两个返回值的原因,下文会对该过程进行详细讲解。 **父进程调用 ****fork()**,操作系统知道它是父进程,所以返回子进程的 PID,方便父进程管理。...子进程和父进程的执行流从 fork() 的返回值处分叉: 父进程继续运行时,fork() 返回子进程的 PID。 子进程继续运行时,fork() 返回 0。

    73210

    探索进程控制第一弹(进程终止、进程等待)

    #include pid_t fork(void); 返回值:自进程中返回0,父进程返回子进程id,出错返回-1。...子进程中也有相关管理数据结构也有自己的代码和数据,代码和数据虽然和父进程共享,但是和父进程相互不影响,数据的部分是以写时拷贝时私有,不写时拷贝相当于共享。...当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以开始它们自己的旅程。...fork函数返回值 子进程返回0 父进程返回的是子进程的pid 如何做到有两个返回值? 探索父进程和子进程 文章中有详细解释。 为什么给父进程返回的是子进程的pid,给子进程返回0?...发现返回值是255。

    45710
    领券