情况分类:
kill -9
)main函数返回0:
进程退出的时候,对应的退出码
是用来标定进程执行的结果是否正确
但是如果结果不正确,就返回其他数字表示不同的原因
int main(void)
{
return 0;
}
写代码是为了完成某件事情,我如何得知我的任务跑的如何呢?
通过进程退出码来判断
./mytest //运行一个进程
echo $? // ?是一个变量,该变量永远记录最近一个进程在命令行中执行完毕时对应的退出码,取变量值是$?
//此时返回1;(上个main函数的退出码是1)
echo $?
//此时返回0,(上个函数就是echo函数,所以是打印的echo的退出码)
如果不关心进程退出码,就return 0
如果未来要关心进程退出码时,要返回特定的数据表明特定的错误
退出码的意义:
一般用0表示成功,用非0表示错误,非0具体是几,标示不同的错误->数字对人不友好,对计算机友好->一般而言,退出码一般都必须有对应的退出码的文字描述->1.可以自定义 2.可以使用系统的映射关系(不太常用)
系统退出码:
#include
#include
int main()
{
for(int i = 0;i < 200; i++)//在for内定义变量需要在makefile中加一个-std=c99
{
printf("%d:%s\n",i,strerror(i));
}
}
代码运行完毕,结果正确
代码运行完毕,结果不正确 (退出码在这里起效果)
代码异常终止(代码没有跑完,程序直接异常),此时退出码无意义
echo $?
查看进程退出码)://在main中调用exit:
#include
#include
#include
#include
int main ()
{
printf("hello world\n");
exit(12);//此时的进程退出码即为12
while(1)//此时不会进入死循环,因为已经退出了
{
sleep(1);//头文件:unistd
}
}
//在函数中调用exit:
#include
#include
#include
#include
int addToTarget()
{
int sum = 0;
for(int i = from;i < to; i++)
{
sum += 1;
}
exit(21);
//_exit(31);两个都是可以的
}
int main ()
{
int ret = addToTarget();
//此时整个进程就已经终止了,不能再进入打印和死循环部分了
printf("%d",ret);
while(1) sleep(1);
}
exit是库函数,_exit是系统调用
exit
终止进程,主动刷新缓冲区
_exit
终止进程,不会刷新缓冲区
因为exit
实际上是调用了_exit
,所以可以说明这个缓冲区一定不在操作系统里
#include
#include
#include
#include
int main ()
{
printf("hello world");//注意这里没有\n来刷新缓冲区
sleep(2);
exit(1);//在两秒后进程退出时会打印出来
//_exit();//不会打印出来
}
ctrl + c
,信号终止
#include
void _exit(int status);
参数:status 定义了进程的终止状态,父进程通过wait来获取该值
说明:虽然status是int,但是仅有低8位可以被父进程所用。所以_exit(-1)时,在终端执行$?发现返回值是255。
#include
void exit(int status);
exit最后也会调用_exit, 但在调用_exit之前,还做了其他工作:
实例:
int main()
{
printf("hello");
exit(0);
}
运行结果:
[root@localhost linux]# ./a.out
hello[root@localhost linux]#
int main()
{
printf("hello");
_exit(0);
}
运行结果:
[root@localhost linux]# ./a.out
[root@localhost linux]#
return是一种更常见的退出进程方法。执行return n等同于执行exit(n),因为调用main的运行时函数会将main的返回值当做 exit的参数。