exit()函数详解与Exit() 和 Return() 的区别

news/2024/5/18 21:51:09 标签: signal, 编译器, c
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">
color:rgb(85,85,85); font-family:宋体,'Arial Narrow',arial,serif; line-height:28px"> color:rgb(198,10,0); padding:0px; margin:0px">exit(0) 表示程序正常, color:rgb(198,10,0); padding:0px; margin:0px">exit(color:rgb(198,10,0); padding:0px; margin:0px">1)/color:rgb(198,10,0); padding:0px; margin:0px">exit(-color:rgb(198,10,0); padding:0px; margin:0px">1)表示程序异常退出
color:rgb(85,85,85); font-family:宋体,'Arial Narrow',arial,serif">
exit() 结束当前进程/当前程序/࿰c;在整个程序中࿰c;只要调用 exit ࿰c;就结束
return() 是当前函数返回࿰c;当然如果是在主函数main, 自然也就结束当前进程了࿰c;如果不是࿰c;那就是退回上一层调用。在多个进程时.如果有时要检测上进程是否正常退出的.就要用到上个进程的返回值..
exit(1)表示进程正常退出. 返回 1;
exit(0)表示进程非正常退出. 返回 0.
color:rgb(85,85,85); font-family:宋体,'Arial Narrow',arial,serif; font-size:14px; line-height:28px">
color:rgb(85,85,85); font-family:宋体,'Arial Narrow',arial,serif; font-size:14px; line-height:28px"> color:#800080; padding:0px; margin:0px">进程环境与进程控制(1): 进程的开始与终止
color:rgb(85,85,85); font-family:宋体,'Arial Narrow',arial,serif; font-size:14px; line-height:28px"> 1. 进程的开始:
C程序是从main函数开始执行, 原型如下:
color:#000000; padding:0px; margin:0px">class="Code" style="padding:0px 5px; margin:0px; border:1px solid rgb(139,69,19); color:rgb(0,0,102); font-family:'Courier New',monospace; background-color:rgb(255,153,51)">int main(int argc, char *argv[]);
通常main的返回值是int型, 正确返回0. 
如果main的返回值为void或者无, 某些class="tags" href="/tags/BianYiQi.html" title=编译器>编译器会给出警告, 此时main的返回值通常是0.
color:rgb(85,85,85); font-family:宋体,'Arial Narrow',arial,serif; font-size:14px; line-height:28px"> 关于main的命令行参数不做过多解释, 以下面的程序展示一下:
class="Code" style="padding:0px 5px; margin:0px; border:1px solid rgb(139,69,19); color:rgb(0,0,102); font-family:'Courier New',monospace; background-color:rgb(255,153,51); font-size:14px; line-height:28px">
#include <stdio.h>
int main(int argc, char *argv[])
{
     int i;
     for (i = 0; i < argc; i++)
         printf("argv[%d]: %s\n", i, argv[i]);
     return 0;
}
2. 进程终止:
C程序的终止分为两种: 正常终止和异常终止.
正常终止分为: return, exit, _exit, _Exit, pthreade_exit
异常中指分为: abort, SIGNAL, 线程响应取消
主要说一下正常终止的前4种, 即exit系列函数.
class="Code" style="padding:0px 5px; margin:0px; border:1px solid rgb(139,69,19)">#include <stdlib.h>    /* ISO C */
void exit(int status);
void _Exit(int status);
#include <unistd.h>    /* POSIX */
void _exit(int status);

以上3个函数的区别是:
exit()(或return 0)会调用终止处理程序和用户空间的标准I/O清理程序(如fclose), _exit和_Exit不调用而直接由内核接管进行清
理.
因此, 在main函数中exit(0)等价于return 0.
3. atexit终止处理程序:
ISO C规定, 一个进程最对可登记32个终止处理函数, 这些函数由exit按登记相反的顺序自动调用. 如果同一函数登记多次, 也会被
调用多次.
原型如下:
class="Code" style="padding:0px 5px; margin:0px; border:1px solid rgb(139,69,19)">#include <stdlib.h>
int atexit(void (*func)(void));
其中参数是一个函数指针, 指向终止处理函数, 该函数无参无返回值.
以下面的程序为例:
class="Code" style="padding:0px 5px; margin:0px; border:1px solid rgb(139,69,19)">
#include <stdlib.h>
static void myexit1()
{
     printf("first exit handler\n");
}
static void myexit2()
{
     printf("second exit handler\n");
}
int main()
{
     if (atexit(my_exit2) != 0)
         printf("can't register my_exit2\n");
     if (atexit(my_exit1) != 0)
         printf("can't register my_exit1\n");
     if (atexit(my_exit1) != 0)
         printf("can't register my_exit1\n");
     printf("main is done\n");
     return 0;
}
运行结果:
$ ./a.out
main is done
first exit handler
first exit handler
second exit handler color:rgb(85,85,85); font-family:宋体,'Arial Narrow',arial,serif; font-size:14px; line-height:28px">运行结果:
color:rgb(85,85,85); font-family:宋体,'Arial Narrow',arial,serif; font-size:14px; line-height:28px" /> color:rgb(85,85,85); font-family:宋体,'Arial Narrow',arial,serif; font-size:14px; line-height:28px">$./a.out arg1 arg2 arg3
color:rgb(85,85,85); font-family:宋体,'Arial Narrow',arial,serif; font-size:14px; line-height:28px" /> color:rgb(85,85,85); font-family:宋体,'Arial Narrow',arial,serif; font-size:14px; line-height:28px">argv[0]: ./a.out
color:rgb(85,85,85); font-family:宋体,'Arial Narrow',arial,serif; font-size:14px; line-height:28px" /> color:rgb(85,85,85); font-family:宋体,'Arial Narrow',arial,serif; font-size:14px; line-height:28px">argv[1]: arg1
color:rgb(85,85,85); font-family:宋体,'Arial Narrow',arial,serif; font-size:14px; line-height:28px" /> color:rgb(85,85,85); font-family:宋体,'Arial Narrow',arial,serif; font-size:14px; line-height:28px">argv[2]: arg2
color:rgb(85,85,85); font-family:宋体,'Arial Narrow',arial,serif; font-size:14px; line-height:28px" /> color:rgb(85,85,85); font-family:宋体,'Arial Narrow',arial,serif; font-size:14px; line-height:28px">argv[3]: arg3
cle>

http://www.niftyadmin.cn/n/790700.html

相关文章

拷贝构造函数的参数为什么必须使用引用类型

在C中&#xff0c; 构造函数&#xff0c;拷贝构造函数&#xff0c;析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识。 但是如果我问你“拷贝构造函数的参数为什么必须使用引用类型&#xff1f;”这个问题&#xff0c; 你会怎么回答&#xff1f; 或许你会回答为…

C\C++文件操作对比

开个话题&#xff0c;C\C文件操作对比 网上多是介绍几种文件操作方式&#xff0c;很少见到比较两种操作的&#xff0c;开个话题有时间研究总结一下&#xff1a; C与C文件操作的对比&#xff0c;包括各自特点、效率&#xff0c;C编程里面究竟应该使用stdio还是stream的文件操作&…

Android 技术积累 索引篇

Android基础: 源码源码&#xff0c;你不要睡着啦。 Android源码分析—带你认识不一样的AsyncTask Android事件传递机制 Android Context完全解析 转郭神名作并简略总结 Handler Looper MessageQueue 深度总结 Android 我的第一个 NDK 程序 (AndroidStudio) Android Hand…

图像去模糊之初探--Single Image Motion Deblurring

原文连接&#xff1a;http://blog.csdn.net/dcraw/article/details/5849538 图像的模糊按照模糊核的性质来分类可分为&#xff1a; Blind image deconvolution&#xff08;BID 芒去卷积&#xff09;和Non-blind image deconvolution&#xff08;NBID 非芒去卷积&#xff09;。B…

MST索引

并发编程面试题&#xff08;2020最新版&#xff09; https://thinkwon.blog.csdn.net/article/details/104863992 MySQL数据库面试题&#xff08;2020最新版&#xff09; https://thinkwon.blog.csdn.net/article/details/104778621 Redis面试题&#xff08;2020最新版&…

傅里叶变换和小波分析

无论是傅立叶变换还是小波变换&#xff0c;其实质都是一样的&#xff0c;既&#xff1a;将信号在时间域和频率域之间相互转换&#xff0c;从看似复杂的数据中找出一些直观的信息&#xff0c;再对它进行分析。由于信号往往在频域有比在时域更加简单和直观的特性&#xff0c;所以…

大牛很通俗地介绍《信号与系统》

第一课 什么是卷积 卷积有什么用 什么是傅利叶变换 什么是拉普拉斯变换 引子很多朋友和我一样&#xff0c;工科电子类专业&#xff0c;学了一堆信号方面的课&#xff0c;什么都没学懂&#xff0c;背了公式考了试&#xff0c;然后毕业了。先说"卷积有什么用"这个问题。…

从头到尾彻底理解傅里叶变换算法

上&#xff1a;http://blog.csdn.net/v_july_v/article/details/6196862 下&#xff1a;http://blog.csdn.net/v_july_v/article/details/6200945