首页
学习
活动
专区
工具
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.4K30

进程 (一).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

56130
  • 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之后,进程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呢?

    8210

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

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

    1.7K20

    【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)来返回值

    15410

    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。

    14410

    【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。

    11710

    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】开始掌握进程控制吧!

    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 ,那为什么要返回零呢???

    10210

    【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成功的话有两个返回值

    35610

    【Linux】进程详解:进程创建&终止&等待&替换

    但每个进程都将可以开始它们自己旅程 因此我们就可以知道fork()创建一个进程之所以会有两个返回值原因 fork()函数内部执行过程中,就已经创建了一个新进程,所以新进程会有一个返回值,而父进程也会有一个返回值...子进程继承了父进程中所有的打开文件,所以父子进程共享所有的文件 2.2 fork 函数返回值 之前博客中就说过了fork()函数有两个返回值,子进程返回0,父进程返回子进程PID,下面就需要解决三个问题...fork()为什么会出现两个返回值❓ 根据fork()函数在内核中操作就包含了子进程数据结构创建,所以fork()返回之前,子进程就已经被创建出来了。...而一旦被创建出来一个独立进程就会有返回值,所以调用这个fork()函数父进程有一个返回值,而创建出子进程也会有一个返回值 因为这两个过程是fork()函数内部就已经完成了,因此我们fork...如果想要写一个C/C++程序代码,写第一个函数一定是main(),而main()是由返回值。 而所谓进程退出码就是以main()函数返回值形式返回

    24110

    【Linux】进程控制

    文章目录 一、进程创建 1、再谈 fork 函数 2、fork 函数返回值 3、写时拷贝 4、fork 常规用法 5、fork 调用失败原因 二、进程终止 1、进程退出码 2、进程退出情况 3、进程退出方法...函数: 头文件:unistd.h 函数原型:pid_t fork(void) 函数功能:创建一个子进程 函数返回值:创建成功 -- 给父进程返回子进程pid,给子进程返回...2、fork 函数返回值 学过 C/C++ 时候同学都知道,一个函数最多只能有一个返回值,那么我们应该如何理解 fork 函数有两个返回值呢?...另外,为什么 fork 给父进程返回子进程 pid,而给子进程返回0呢?...地址相同,但这只是虚拟地址相同,而物理地址并不相同,所以父子进程 g_val 也能够不同;对于接受 fork 返回值变量 id 来说也一样,先进行 return 进程会对 id 进行写时拷贝

    4.1K00

    初识Linux · 进程(3)

    父进程也可以执行啊,为什么要创建呢?这时候,前面埋下伏笔就起作用了,这里有个很让人迷惑问题,一个函数返回值可以返回几次呢?...欸大多数初学者可能都会回答一次,但是fork奇异之处就在这里: 当我们man fork之后,在手册里面查询返回值时候,返回值描述是这样: On success, the PID of...翻译过来就是,成功创建子进程,那么子进程Pid就会返回给父进程,0返回给子进程,失败了就是返回-1给父进程,也就是说,成功了会有两个返回值,我们就可以写如下代码: 7 pid_t id = fork...: 按照以前C语言逻辑,是只会打印一个,这里就有点颠覆了代码三观了~ 但是奇怪了,明明变量只有一个id啊,为什么会有两份?...那么我们如何创建指定量进程呢? 如果我们采用最开始指数级别的来创建,肯定是不好控制,那么我们就可以使用fork返回值,来帮助我们创建指定数量进程。

    5310

    fork,wait和exec

    fork,wait和exec fork系统调用 wait系统调用 exec系统调用 为什么要把fork和exec分开 ---- fork系统调用 1、子进程不会从 main()函数开始执行,而是直接从...2、子进程拥有自己地址空间(即拥有自己私有内存)、寄存器、程序计数器等 3、父进程获得返回值是新创建子进程 PID,而子进程获得返回值是 0 4、子进程和父进程运行顺序取决于CPU调度顺序...例如,p2.c 中调用 fork(),这只是在你想运行相同程序拷贝谁有用。...:%d)\n", rc, wc, (int) getpid()); } return 0; } ---- 为什么要把fork和exec分开 构建UNIX shell 时候非常有用,因为这给了...shell fork 之后exec 之前运行代码机会,这些代码可以在运行新程序前改变环境,实现一些有趣功能。

    1K20
    领券