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

为什么fork()的返回值在C中有2个pid值?

在C语言中,fork()函数的返回值有两种可能的值,分别是0和正整数。这两个值的含义如下:

  1. 如果fork()函数返回0,那么说明当前进程是子进程。在这种情况下,fork()函数会返回0,表示子进程的进程ID为0。
  2. 如果fork()函数返回一个正整数,那么说明当前进程是父进程。在这种情况下,fork()函数会返回子进程的进程ID,这个进程ID是一个正整数。

这种设计是为了方便程序员在编写多进程程序时能够区分父进程和子进程,从而能够根据不同的进程执行不同的代码逻辑。

以下是一个简单的示例代码,展示了如何使用fork()函数创建子进程,并根据返回值判断当前进程是父进程还是子进程:

代码语言:c
复制
#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main() {
    pid_t pid = fork();
    if (pid == 0) {
        printf("I am the child process, my pid is %d\n", getpid());
    } else if (pid > 0) {
        printf("I am the parent process, my pid is %d\n", getpid());
    } else {
        printf("fork() failed\n");
    }
    return 0;
}

在这个示例代码中,我们使用fork()函数创建了一个子进程,并根据fork()函数的返回值判断当前进程是父进程还是子进程。如果当前进程是子进程,则输出子进程的进程ID;如果当前进程是父进程,则输出父进程的进程ID。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C语言中的函数为什么只能有一个返回值输出?怎么实现多个值输出?

这是典型的C语言中函数模块中的返回值问题,算是常见的语法细节,很多人觉得C语言已经过时了,只能代表着这类人还不算是真正的技术人员,在嵌入式领域C语言依然充当着非常重要的角色,C语言在很多领域还是首选编程语言...常见的C语言难点有指针,结构体,函数,递归,回调,数组等等,看起来没多少东西,每个概念都能延伸很多功能点,今天的题目其实就是函数模块中的返回值的问题,面向对象编程的基本单元就属于函数,函数包括参数输入,...具体功能实现,最后是结果的输出,也就是这个题目的返回值,在正常情况下函数的返回值只有一个,但在实际编程中需要用到多个,在设计时候还是归结成一类,如果类型相近可以弄成数组方式,如果类型不太一致直接放在结构体中执行...,如果函数返回值是个指针的话,就能把整个结构体里面的内容返回出来,同样能够达到返回多个数值的作用,这种在平常的编程过程中用的最多,C语言中使用最频繁的关键点就是指针了,但也是很多初学者最不好理解的知识点...很多在刚开始学习C语言的初学者,因为项目经验不多,可能喜欢玩一些文字游戏,比如返回多个值的这样的题目,在实际项目中用的时候还是以实用为主,还要根据实际的情况,毕竟在实际项目中怎么去做选择的空间非常大,以稳定和实用为主

7.5K30

进程 (一).fork(1)

那为什么是多任务的操作系统呢,那是由于操作系统将CPU时间分成很多的小时间片,并且将这些时间片分配给不同的任务,然后根据特定的方法在不同任务间进行快速的轮转(每一次切换任务都会对当前任务的进展进行保存,...fork函数创建新进程,并将返回值存入pe变量中,这个过程成功后就会多出一个进程,被派生出来的进程称为子进程,pe也会多出一份拷贝,通过pe的值可以判断身处在哪一个之中 if(0 < pe) //如果...("waitpid"); //如果为-1,那么就是出错,进行提醒 } else if(0 == pe) //fork返回值为0的时候代表子进程 { printf ("this is...return 123; //退出的状态码为123,这个值的范围在0~256 } else //fork返回值为负的时候代表调用出错 { perror("fork"); //进行提醒...当中有如预期一样的停顿,并且执行的先后顺序符合期望) ---- pid_t 的定义 在头文件中,我们通过层层追溯的方式可以找到一个类型的定义 这里我们来看看 pid_t 究竟是什么 emacs@ubuntu

56430
  • 详谈 Linux进程控制(看这一篇就够了)

    #include pid_t fork(void); 返回值:子进程中返回0, 父进程中返回子进程id, 出现错误则返回-1 进程调用fork,当控制转移到内核中的fork代码后,...✨2. fork函数的返回值 子进程返回0,父进程返回的是子进程的pid。 为什么有两个返回值, 因为fork之后是两个不同的进程, 而返回值也是给不同的进程。...一个进程要执行一个不同的程序, 例如子进程从fork返回后,调用exec函数。 ✨5. fork调用失败的原因 系统中有太多的进程。 实际用户的进程数量超过了限制。 三....来获取, 如下图所示: 对于返回值,0表示成功, 非0表示错误,为什么会失败呢?系统提供了不同的错误码信息记录了错误的原因, 也可以自己约定错误码。 那么什么是错误码呢?...进程等待 首先我们可以查看一下fork的返回值, 如果fork失败, 则错误码会被设置。

    13010

    Linux进程控制

    一.进程创建 fork()函数: 在进程概念这篇文章中,我们浅浅地了解了一下fork函数,它的功能是让父进程去创建一个子进程,并且有两个返回值,对应着父进程的返回值和子进程的返回值。...#include pid_t fork(void); 返回值:子进程中返回0,父进程返回子进程id,出错返回-1 先来看三个问题: 1.如何理解fork函数有两个返回值的问题?...2.如何理解fork函数返回后,子进程中返回0,父进程返回子进程id? 3.如何理解同一个id值,为什么会保存两个不同的值,让if  else  if同时执行?...所以,fork函数就有两个返回值,一个是返回子进程的,一个是返回父进程的。 第三个问题:3.如何理解同一个id值,为什么会保存两个不同的值,让if  else  if同时执行? 返回的本质就是写入。...所以,对于pid_t id = fork();为什么会保存两个不同的值,就先看谁先返回,那就谁先写入id。

    2.4K30

    【Linux系统编程】五、进程创建 -- fork()

    如下是函数的声明和返回值: #include pid_t fork(void); // 返回值:子进程中返回0,父进程返回子进程id,出错返回-1 ​ 但是之前我们一直有个问题没有解决...,那么就是**为什么一个函数一个返回两个值?...二、如何理解fork()有两个返回值 ​ 父进程 fork 时,子进程是以父进程为模板,简单地说就是子进程的大部分属性和属性值是拷贝父进程的,而小部分是指子进程的调度时间要重置、子进程的 pid、ppid...那其中 为什么 fork() 给父进程返回 子进程的pid,给子进程返回 0 呢???...利用 fork 返回值的这个特性,我们可以用变量 id 接收返回值,根据 fork 返回值不同让父子进程执行不同的代码,这个我们之前也讲过啦,简单过一下就好!

    10310

    初识Linux下进程

    证明:fork之后,进程ppid(父进程id)就是fork之前进程的pid。 ✈️fork的返回值   fork可以创建子进程,而要控制子进程,就与fork的返回值有关了。   ...fork的返回值是pid_t的一种特殊类型,返回值为0时返回到子进程,返回值为子进程pid时,返回到父进程,如果返回值小于0表示错误。也就是说,fork其实有两个返回值。  ...至于为什么有两个返回值,这里我们说不清,现在只需要记住即可,后面我们会详谈。...✈️再谈fork返回值   前面我们说,fork之后的返回值有两个,通过上面的实验我们也可说明fork之后确实同时存在两个返回值。一个为0,一个为子进程pid。...也就是说 在return返回之前,子进程已经创建出来了,并且和父进程同时在执行,两个进程返回不同的id值也就能说的过去了! 为什么接收fork的返回值的变量id既等于0,又大于0呢?

    8510

    【Linux】Linux进程控制>进程创建&&进程终止&&进程等待&&进程程序替换

    新进程为子进程,而原进程为父进程 #include pid_t fork(void); 返回值:自进程中返回0,父进程返回子进程id,出错返回-1 进程调用fork,当控制转移到内核中的...注意,fork之后,谁先执行完全由调度器决定 1.2 fork函数返回值 子进程返回0, 父进程返回的是子进程的pid 1.2.1 写时拷贝 通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入...例如子进程从fork返回后,调用exec函数 1.4 fork调用失败的原因 、 系统中有太多的进程 实际用户的进程数超过了限制 2.进程终止 2.1 进程退出场景 代码运行完毕,结果正确...被调用的函数执行一定的操作,然后返回一个值。每个函数都有他的局部变量,不同的函数通过call/return系统进行通信 这种通过参数和返回值在拥有私有数据的函数间通信的模式是结构化程序设计的基础。...Linux鼓励将这种应用于程序之内的模式扩展到程序之间。如下图 一个C程序可以fork/exec另一个程序,并传给它一些参数。这个被调用的程序执行一定的操作,然后通过exit(n)来返回值。

    16710

    Linux系统-进程控制

    Linux进程控制 零、前言 一、进程创建 1、fork函数 2、fork返回值 写时拷贝 3、fork用法 4、fork失败 二、进程终止 1、退出码 2、退出方法 1) 调用_exit函数 2)调用...fork:pid is %d, fork return %d\n", getpid(), pid); sleep(1); return 0; } 结果: 示图: 2、fork返回值...返回值: fork成功对子进程返回0,对父进程返回子进程的pid 写时拷贝 概念: fork成功之后父子代码共享,当父子不写入数据时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本..._ t waitpid(pid_t pid, int *status, int options); 注意: 返回值: 当正常返回的时候waitpid返回收集到的子进程的进程ID 如果设置了选项...,不再返回(已经将代码和数据全部替换,执行新程序的执行逻辑) 如果调用出错则返回-1,所以exec函数只有出错的返回值而没有成功的返回值 命名理解: l(list) : 表示参数采用列表的形式传入如何使用程序或者命令

    1.5K30

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

    #include pid_t fork(void); 返回值:自进程中返回0,父进程返回子进程id,出错返回-1。...fork函数返回值 子进程返回0 父进程返回的是子进程的pid 如何做到有两个返回值? 探索父进程和子进程 文章中有详细解释。 为什么给父进程返回的是子进程的pid,给子进程返回0?...例如子进程从fork返回后,调用exec函数 fork调用失败的原因 系统中有太多的进程 实际用户的进程数超过了限制 写时拷贝 通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本...进程终止的情况 代码跑完,结果正确/不正确 main函数的返回值是100,通过echo ?查询。在系统中有一个变量叫做?,查看这个变量使用?,访问变量内容都可以使用echo。...所以_exit(-1)时,在终端执行$?发现返回值是255。

    15910

    如何创建多进程程序?(文末福利)

    来源:公众号【编程珠玑】 作者:守望先生 网站:https://www.yanbinghu.com 前言 在《对进程和线程的一些总结》已经介绍了进程和线程的区别,但是在C/C++中如何创建进程呢?...fork函数原型如下: #include pid_t fork(void); 如果调用成功,它将返回两次,子进程返回值是0;父进程返回的是非0正值,表示子进程的进程id;如果调用失败将返回...即fork之后,子进程名义上拥有父进程的副本,但是实际上和父进程共用,只有当父子进程中有一个试图修改这些区域时,才会以页为单位创建一个真正的副本。...test.txt 为什么这里要特别说明打开的文件描述符呢?...fork之后的返回值不同,进程ID也不同 子进程未处理信号设置为空 子进程不继承父进程设置的文件锁 一般子进程会执行与父进程不完全一样的代码流程 … 总结 fork用于创建进程,但是需要注意的是,子进程继承了很多父进程的东西

    1.7K20

    Linux系统编程:理解进程进程管理

    六,重点:使用系统接口fork创建子进程 fork的功能是创建子进程,如果创建成功给子进程的返回值是0,给父进程的返回值是子进程的PID,如果子进程创建失败,就会返回一个负数 你没有听错,fork有两个返回值...我们竟然发现,if和else if竟然在同时运行!这也验证了fork的确有两个返回值,虽然if 和else if 同时执行了,但是却是在不同的进程中; 6.1为什么需要创建子进程?...; 6.2fork的返回值分析 fork为什么给子进程返回0,其实对于子进程来说只是一个标识作用,他可以使用ps 查看自己的PID和父进程的PID; fork为什么给父进程返回子进程的PID;因为父进程需要对创建的子进程进行管理...;这就是数据层面的写时拷贝; 6.4为什么fork会有两个返回值?...我们现在分析一下fork函数-> 我们知道fork函数是拷贝父进程的代码和数据,创建一个新的task_struct,所以这里就有了先后顺序问题; 是先执行完函数返回值之后才创建好了子进程还是在返回值之前就创还能好了子进程呢

    5100

    【Linux】Linux进程控制——进程创建、进程终止及进程等待详解

    ⭐进程创建 fork函数初识 在Linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。...#include pid_t fork(void); 返回值:自进程中返回0,父进程返回子进程id,出错返回-1 进程调用fork,当控制转移到内核中的fork代码后,内核做: 分配新的内存块和内核数据结构给子进程...另一个 after消息有43677 打印的。注意到进程 43677 没有打印 before ,为什么呢?如下图所示 所以, fork之前父进程独立执行,fork之后,父子两个执行流分别执行。...注意,fork之后,谁先执行完全由调度器决定。 fork()的返回值 子进程返回0, 父进程返回的是子进程的pid。...所以_exit(-1)时,在终端执行echo $?发现返回值是255。

    14610

    fork函数简介_fork()&&fork()

    注释(2): fork函数的返回值是pid_t类型的(返回值-1是错误、返回值0是表示子进程、返回值大于0表示父进程实际值是父进程的子进程pid值), fork...fork的返回值是子进程的进程号,如果fork不成功,父进程会返回错误。...fork()是一个经过封装的用户态函数,当用户程序调用了fork函数之后,执行系统调用sys_fork(),而在sys_fork()中直接调用了do_fork()函数,在do_fork()函数中有6个参数...fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:   1)在父进程中,fork返回新创建子进程的进程ID;   2)在子进程中,fork返回0;   3)如果出现错误...引用一位网友的话来解释fpid的值为什么在父子进程中不同。

    1.2K21

    【Linux 进程状态】—— 从创建到消亡的全生命周期

    这是子进程识别自己的方式,通过判断fork的返回值为 0,子进程可以知道自己是新创建的进程,从而执行特定于子进程的代码逻辑。 如果调用失败,子进程没有被创建,无返回值。...为什么一个函数有两个返回值??fork是如何给父子进程分别返回不同的值??为什么一个变量既可以让if成立,又可以让else成立??? 小小的脑袋有着大大的问号,别急我们一个一个回答!...对于第一个问题:为什么一个函数有两个返回值? 根据同学们以往对C语言学习的经验,一个函数只能有0个或者1个返回值,那么这里为什么fork可以返回两个值呢?...fork函数的返回值!...对于这个问题,我们目前解释不清楚,但是我们可以肯定这个变量肯定不是存储在物理内存中,如果在物理内存中,根据地址拿到变量的值,为什么子进程和父进程的值不一样呢?

    9310

    【Linux】开始掌握进程控制吧!

    2 进程创建 2.1 fork函数初识 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。...fork函数具有两个返回值,通过对返回值的判断(if else )可以进行父进程和子进程的不同书写。...2.2 fork函数返回值 子进程返回0 父进程返回的是子进程的pid 那为什么父进程返回子进程PID ,给子进程返回0呢???...2.5 fork调用失败的原因 系统中有太多的进程(数据空间是有限的) 实际用户的进程数超过了限制(必须是有限的) 2 进程终止 2.1 终止是在做什么 进程终止会进行: 释放曾经的代码和数据所占据的空间...释放内核数据结构 但是task_struct会延期处理,因为终止的进程处于Z状态(僵尸进程) 2.2 进程终止的情况 我们的main函数常常会有一个返回值 0 ,那为什么要返回零呢???

    10910

    【Linux系统编程】通过系统调用获取进程标识符 及 创建子进程(fork)

    可以的: 我们可以通过一个系统调用来获取,这个系统调用叫做getpid 我们可以通过man手册学习一下 getpid没有参数,直接调用即可获取(返回)当前进程的pid,返回值是pid_t类型...,为什么PID一直不变呢?...3.4 fork的返回值 接下来我们再来研究一个东西——fork的返回值: 从man手册上看fork的返回值也是一个pid_t类型,这个我们上面说了,就是一个有符号整数类型 但是我们不能只看一个类型...失败的话,-1在父进程中返回,不会创建任何子进程,并且正确设置了errno(C语言中一个用于表示错误码的全局变量,Linux内核是C语言写的)。 也就是说fork成功的话,返回值会有两个。...并没有,但是这里if和elseif里面的语句都执行了,两个while循环同时在执行。 那为什么可以这样呢? 因为fork成功的话有两个返回值。

    43310

    【linux学习指南】进程创建与终止

    #include pid_t fork(void); 返回值:⾃进程中返回0,⽗进程返回⼦进程id,出错返回-1 进程调⽤fork,当控制转移到内核中的fork代码后,内核做:...另⼀个after消息有1398691打印的。注意到进程1398691没有打印before,为什么呢?如下图所⽰ 所以,fork之前⽗进程独⽴执⾏,fork之后,⽗⼦两个执⾏流分别执⾏。...注意,fork之后,谁先执⾏完 全由调度器决定。 fork函数返回值 ⼦进程返回0 ⽗进程返回的是⼦进程的pid。...fork调⽤失败的原因 系统中有太多的进程 实际⽤⼾的进程数超过了限制 进程终⽌ 进程终⽌的本质是释放系统资源,就是释放进程申请的相关内核数据结构和对应的数据和代码。...所以_exit(-1)时,在终端执⾏$?发现返回值是255。

    9910
    领券