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

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

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

8.5K30

【Linux仓库】进程概念与基本操作【进程·贰】

粗略理解进程 我们说过在C/C++中可执行程序需要加载到内存当中,交给CPU进行执行。那么进程是指什么呢? 输出结论:进程 = 内核数据结构(PCB ...)+ 代码和数据。...因此,在CPU中有一套寄存器(上下文数据),它会记录当时进程执行到的代码和数据,下一次轮到该进程被执行时,只需要做硬件上下文的保存和恢复,而不需要重新执行该进程!!!...fork是由操作系统所提供的系统调用,用来创建子进程 fork返回值 可以看到fork是有返回值的,那么它的返回值是用来做啥的呢?如下所示 问题1:返回值为什么是这样的?...成功创建,父进程返回子进程pid,子进程返回0 问题2:一个函数怎么会有两个返回值? 问题3:在我们的印象当中,一个变量不应该只有一个返回值吗?为什么这里一个变量可以返回一个大于0,又能返回等于0?...解惑问题2: 证明确实有两个返回值: 为什么有两个返回值: 在fork的内部在返回值之前就创建了子进程,此时父子分别执行不同的代码区域,从而实现让父子执行不同的任务!

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

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

    76130

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

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

    38710

    【Linux篇】进程控制

    #include pid_t fork(void); 返回值:⾃进程中返回0,⽗进程返回⼦进程id,出错返回-1 进程调用fork,当控制转移到内核中的fork代码后,内核做: 分配新的内存块和内核数据结构给子进程...减少子进程的创建时间 减少内存浪费 1.3 fork调用失败的原因 系统中有太多的进程 实际用户的进程数超过了限制 2....所以_exit(-1)时,在终端执行$?发现返回值是255。...在程序替换的时候,并没有创建新的进程,只是把当前进程的代码和数据用新的进程的代码和数据覆盖式的进行替换。 问题一:“为什么我的程序运行结束了”,这段话没有在显示器上打印出来?...a.进程具有独立性 b.数据和代码发生写时拷贝 execl的返回值 execl函数只有失败返回值,没有成功返回值 结论:exec*系列的函数,不用做返回值判定,只要返回,就是失败 4.1 替换原理

    42010

    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.8K30

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

    3.2K10

    初识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呢?

    37210

    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) : 表示参数采用列表的形式传入如何使用程序或者命令

    2K30

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

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

    45810

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

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

    1.8K20

    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,所以这里就有了先后顺序问题; 是先执行完函数返回值之后才创建好了子进程还是在返回值之前就创还能好了子进程呢

    26300

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

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

    29810

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

    2.6K10

    【Linux】进程控制&实现自主shell

    #include pid_t fork(void); 返回值:⾃进程中返回0,⽗进程返回⼦进程id,出错返回-1 进程调用fork,当控制转移到内核中的fork代码后,内核做: 分配新的内存块和内核数据结构给子进程...注意,fork之后,谁先执行完全由调度器决定。 2、fork函数返回值 子进程返回0, 父进程返回的是子进程的pid。...所以_exit(-1)时,在终端执行$?发现返回值是255。...被调用的函数执行一定的操作,然后返回一个值。每个函数都有他的局部变量,不同的函数通过call/return系统进行通信。 这种通过参数和返回值在拥有私有数据的函数间通信的模式是结构化程序设计的基础。...Linux⿎励将这种应用于程序之内的模式扩展到程序之间。如下图 一个C程序可以fork/exec另一个程序,并传给它一些参数。这个被调用的程序执行一定的操作,然后通过exit(n)来返回值。

    38810

    【寻找Linux的奥秘】第八章:进程控制

    fork函数会有两个返回值,它会给父进程返回子进程的pid,给子进程返回0;如果进程创建失败,就会给父进程返回-1。 fork调用失败的原因: 系统对每个用户能创建的最大进程数有限制。...fork返回,开始调度器调度。 也就是说,在fork函数还没有执行完时,子进程就已经被创建出来了,并且和父进程拥有相同的代码和数据,所以父进程和子进程都会有自己的返回值在fork中。...所以看似fork函数有两个返回值是我们肉眼所看到认为的,实际上是有两个进程在执行,它们有各自的返回值。 当⼀个进程调⽤fork函数之后,就有两个⼆进制代码相同的进程。⽽且它们都运⾏到相同的地⽅。...其实在我们学习C/C++的时候,我们知道main函数的结束就是return语句,return返回的值我们称之为退出码,所以main函数的返回值通常表明程序的执行情况,当代码正常执行并且结果正确,我们一般将返回值设置为...我们之前在C语言中可以使用strerror函数来查看退出码对应的原因是什么,那么让我们来看一看Linux中有多少个退出码以及它们对应的原因: #include #include<string.h

    33310
    领券