c语言exit和return区别,在fork和vfork中使用

From: http://www.cnblogs.com/laojie4321/archive/2012/03/31/2426910.html

exit函数在头文件stdlib.h中。

exit(0):正常运行程序并退出程序;

exit(1):非正常运行导致退出程序;

return():返回函数,若在main主函数中,则会退出函数并返回一值,可以写为return(0),或return 0。

详细说:

  1. return返回函数值,是关键字;exit是一个函数。

  2. return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。
  3. return是函数的退出(返回);exit是进程的退出。

  4. return是C语言提供的,exit是操作系统提供的(或者函数库中给出的)。

  5. return用于结束一个函数的执行,将函数的执行信息传出个其他调用函数使用;exit函数是退出应用程序,删除进程使用的内存空间,并将应用程序的一个状态返回给OS,这个状态标识了应用程序的一些运行信息,这个信息和机器和操作系统有关,一般是 0 为正常退出,非0 为非正常退出。

  6. 非主函数中调用return和exit效果很明显,但是在main函数中调用return和exit的现象就很模糊,多数情况下现象都是一致的。

 下面是几个例子:

1.

?
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
  pid_t pid;
  int count=0;
  pid=vfork();
  if(pid==0)
  {
    printf("child: count=%d\n",count);
    printf("child: getpid=%d\n",getpid());
    count=1;
    printf("child: count=%d\n",count);
    // return 0;//会出现段错误
    exit(0); //ok
  }
  else
  {
    printf("\nfather: pid=%d\n",pid);
    printf("father: count=%d\n",count);
  }
  return(0);
}

 

运行结果

?
[root@localhost part1_linux]# gcc fork2.c
[root@localhost part1_linux]# ./a.out
child: count=0
child: getpid=9911
child: count=1
father: pid=9911
father: count=1

运行结果说明:vfrok时父、子进程共享数据段,fork时是进行拷贝。如果,vfork子进程中,使用return返回时,出现段错误,结果如下:

?
[root@localhost part1_linux]# gcc fork2.c
[root@localhost part1_linux]# ./a.out
child: count=0
child: getpid=10864
child: count=1
father: pid=10864
father: count=0
段错误
2. 为什么执行结果子进程打印出来 我的父亲是id:1,与父进程id不同
?
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
    int i=0;
    pid_t pid;
    printf("还没创建子进程\n");
    i++;
    pid = fork();
    if(pid==-1)
    {
      printf("fork error!\n");
    }
    else if(pid==0)
    {
      i++;
      printf("我是子进程,id%d\n",getpid());
      printf("我的父亲是id:%d\n",getppid());
      printf("-----i=%d-----\n",i);
    }
    else
    {
      i++;
      printf("我是父进程,id:%d\n",getpid());
      printf("-----i=%d-----\n",i);
    }
    exit(0);
}
子进程在打印第一句时,父进程也在打印第一句,但是子进程在执行第二句时,父进程已经直接over了(这只是个简单的说法,实际过程可能并不如此,我要说的是,父进程先于子进程的打印语句之前就结束)。因此此时的子进程成了孤儿进程,会被init也就是1号进程领养,成为init的子进程。 为了避免这样的情况,父进程最后可以执行wait来等待子进程的返回。
3. 用vfork()创建子进程,执行后程序一直不断地重复运行,不断创建子进程,结尾用exit(0)代替return(0)后问题就能解决
return 0在一个函数中是正常的返回过程,它会使得程序返回到函数被调用处,回复之前的执行流程,return 语句不会被执行。而exit 一般是在任意位置和使用的,执行到exit 0时,整个进程就over了(这也是为什么在多线程程序中不要随意使用exit的原因),用来使程序退出运行,一般用来处理(不可挽回的)错误状态。
?
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
  int i=0;
  pid_t pid;
  printf("还没创建子进程\n");
  i++;
  pid = vfork();
  if(pid==-1)
  {
    printf("fork error!\n");
  }
  else if(pid==0)
  {
    i++;
    printf("我是子进程,id%d\n",getpid());
    printf("我的父亲是id:%d\n",getppid());
    printf("-----i=%d-----\n",i);
  }
  else
  {
    i++;
    printf("我是父进程,id:%d\n",getpid());
    printf("-----i=%d-----\n",i);
  }
  return(0);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[react] 说说你对“在react中,一切都是组件”的理解

[react] 说说你对“在react中&#xff0c;一切都是组件”的理解 React采用组件化的思想&#xff0c;最小的组件单位就是原生HTML元素&#xff0c;采用JSX的语法声明组件的调用React的虚拟DOM&#xff0c;就是一个大的组件树&#xff0c;从父组件层到子组件&#xff0c;在rende…

DWT算法

C写的DWT算法转载于:https://blog.51cto.com/yerik/764890

gcc 编译选项

From: http://blog.csdn.net/guogeer/article/details/7407508 [html] view plaincopy下列选项控制编译器警告信息: --all-warnings 此开关缺少可用文档 --extra-warnings 此开关缺少可用文档 -W 不建议使用此开关…

[react] react中的key有什么作用?

[react] react中的key有什么作用&#xff1f; react利用key来识别组件&#xff0c;它是一种身份标识标识&#xff0c;就像我们的身份证用来辨识一个人一样。每个key对应一个组件&#xff0c;相同的key react认为是同一个组件&#xff0c;这样后续相同的key对应组件都不会被创建…

【转】ps命令详解

原文地址&#xff1a;http://apps.hi.baidu.com/share/detail/32573968 有 时候系统管理员可能只关心现在系统中运行着哪些程序&#xff0c;而不想知道有哪些进程在运行。由于一个应用程序可能需要启动多个进程。所以在同等情况下&#xff0c;进程的数 量要比程序多的多。为此从…

Amazon S3 设置对象的生命周期Lifecycle

2019独角兽企业重金招聘Python工程师标准>>> 保存在S3上面的文件&#xff0c;有些是长期保存的&#xff0c;而有一些我们却不希望保存太久&#xff0c;过一段时间后就可以删除了。例如备份文件&#xff0c;太旧的就要删除&#xff1b;又或如日志文件&#xff0c;只保…

[react] react非父子组件如何通信?

[react] react非父子组件如何通信&#xff1f; redux context 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

fatal error C1083: 无法打开包括文件:dxtrans.h: No such file or directory

From: http://blog.csdn.net/pkueecser/article/details/7287938 fatal error C1083: 无法打开包括文件:"dxtrans.h": No such file or directory http://blog.waterlin.org/articles/qedit-problem-in-windows-directshow.html 在使用有关 DirectShow 东西的时…

开灯问题---------简单模拟

有n盏灯&#xff0c;编号为1~n,第一个人把所有灯都打开&#xff0c;第2个人按下所有编号为2的倍数的开关&#xff08;这些灯将会被关掉&#xff09;&#xff0c;第三个人按下所有编号为3的倍数的开关&#xff08;其中关掉的灯将被打开&#xff0c;开着的灯将被关闭&#xff09;…

[react] react中遍历时为什么不用索引作为唯一的key值?

[react] react中遍历时为什么不用索引作为唯一的key值&#xff1f; key值的目的在Diff DOM的时候根据render前后的唯一key值快速的对树进行比较&#xff0c;保证key值得唯一性&#xff0c;如在进行中间插入或者最顶上插入时&#xff0c;算法会很明显得知道这是一个插入动作&am…

TortoiseGit + GitHub 快速上手指南

TortoiseGit GitHub 快速上手指南 名词解释: 1. TortoiseGit 是 TortoiseSVN的Git版&#xff0c;它很好的实现了与windows资源管理器的融合&#xff0c;使用界面与TortoiseSVN非常类似。 2. TortoiseGit运行在msysgit(git的windows开源版本)之上&#xff0c;因此&#xff0c;在…

无法访问windows安装服务的解决

From: http://www.cnblogs.com/huangweilin/archive/2012/12/20/2826032.html 一、问题的提出 一部计算机&#xff0c;要安装类似ofiice的软件&#xff0c;提示无法访问windows安装服务的解决&#xff0c;要卸载类似office的软件&#xff0c;也提示无法访问windows安装服务的…

VMware Fusion8下CentOS7.1 安装vmtools报错kernel header path

VMware Fusion8CentOS7.1安装vmtools ---找不到gcc和kernel header path的解决办法 环境: OSX 10.11.2 VMware Fusion 8.0.2 CentOS 7.1 错误: 1.gcc错误 Searching for GCC...The path "" is not valid path to the gcc binary. 2.内核头文件问题 Searching for a v…

[react] 说说你对reader的context的理解

[react] 说说你对reader的context的理解 这个题想问的应该是render函数的上下文&#xff0c;而非React.createContext的那个Context。 不管是class组件还是函数式组件&#xff0c;React的组件本质上都是函数&#xff0c;从根组件到下面大大小小的子组件&#xff0c;React组件树…

Direct3D提高篇:HLSL编程实现PhotoShop滤镜效果 - 伪 HDR/Blow

所谓HDR就是高动态范围的意思。在普通的显示器和位图里&#xff0c;每通道都是8-bit&#xff0c;也就是说RGB分量的范围都是0-255&#xff0c;这用来表示现实中的颜色显然是远远不够的。现实中的图像的动态范围远远大的多&#xff0c;那么如何在现有的显示设备里尽可能的保持更…

[react] react中什么是非控组件?

[react] react中什么是非控组件&#xff1f; 表单元素的value/checked值、onChange事件没有和组件的state存在绑定关联关系&#xff0c;如果需要获取表单元素的值&#xff0c;需要使用ref获取DOM&#xff0c;然后得到元素的值.demo如下&#xff1a; import React from react;…

[spring-framework]Spring定时器的配置和使用

开发中我们常常会做一些定时任务&#xff0c;这些任务有开始时间&#xff0c;并会按一定的周期或规则执行。如此我们在Java程序开发中使用定时器来处理定时任务。 <!-- MessageRequestTask类中包含了msgRequest方法&#xff0c;用于执行定时任务 --> <bean id"ms…

安装Microsoft Windows SDK 7.1时出现的错误(附解决办法)

From: http://blog.sina.com.cn/s/blog_617c05b001015baw.html 错误回放一: A problem occurred while installing selected Windows SDKcomponents. Installation of the "Microsoft Windows SDK for Windows 7Compilers for x86" product has reported the follow…

上载数据

*&---------------------------------------------------------------------**& 包括 ZHENGZJ_TEST001_FORM*&---------------------------------------------------------------------**&--------------------------------------------------…

[react] react中的setState执行机制是什么呢?

[react] react中的setState执行机制是什么呢&#xff1f; 1.将setState传入的partialState参数存储在当前组件实例的state暂存队列中。 2.判断当前React是否处于批量更新状态&#xff0c;如果是&#xff0c;将当前组件加入待更新的组件队列中。 3.如果未处于批量更新状态&…