【Linux】进程终止

文章目录

  • 进程终止
    • 引入
    • 自己设定main函数返回值
    • 进程退出场景
    • 进程常见退出方法
      • 两种类别:
        • 正常终止(可以通过 `echo $? `查看进程退出码):
        • 异常退出:
      • 函数详解
        • \_exit函数
        • exit函数
        • return退出

进程终止

引入

情况分类:

  1. 正常执行完了
    1. 结果正确
    2. 结果不正确->为什么
  2. 崩溃了(进程异常)【信号】
    1. 崩溃的本质:进程因为某些原因,导致进程收到了来自操作系统的信号(kill -9

main函数返回0:
进程退出的时候,对应的退出码
是用来标定进程执行的结果是否正确
但是如果结果不正确,就返回其他数字表示不同的原因

int main(void)
{
	return 0;
}

写代码是为了完成某件事情,我如何得知我的任务跑的如何呢?

通过进程退出码来判断

./mytest  //运行一个进程
echo $?   // ?是一个变量,该变量永远记录最近一个进程在命令行中执行完毕时对应的退出码,取变量值是$?
//此时返回1;(上个main函数的退出码是1)
echo $?
//此时返回0,(上个函数就是echo函数,所以是打印的echo的退出码)

自己设定main函数返回值

如果不关心进程退出码,就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 $? 查看进程退出码):
  1. 从main返回
  2. 任意地方调用exit ->C标准库函数
//在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);
}
  1. _exit()

exit是库函数,_exit是系统调用
exit终止进程,主动刷新缓冲区
_exit终止进程,不会刷新缓冲区
因为exit实际上是调用了_exit,所以可以说明这个缓冲区一定不在操作系统里
【Linux】进程终止_第1张图片

#include
#include
#include
#include
int main ()
{
	printf("hello world");//注意这里没有\n来刷新缓冲区
	sleep(2);
	exit(1);//在两秒后进程退出时会打印出来
	//_exit();//不会打印出来
}
异常退出:

ctrl + c,信号终止

函数详解

_exit函数
#include   
void _exit(int status);  
参数:status 定义了进程的终止状态,父进程通过wait来获取该值
说明:虽然status是int,但是仅有低8位可以被父进程所用。所以_exit(-1)时,在终端执行$?发现返回值是255
exit函数
#include   
void exit(int status);

exit最后也会调用_exit, 但在调用_exit之前,还做了其他工作:

  1. 执行用户通过 atexit或on_exit定义的清理函数。
  2. 关闭所有打开的流,所有的缓存数据均被写入
  3. 调用_exit
    【Linux】进程终止_第2张图片

实例:

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是一种更常见的退出进程方法。执行return n等同于执行exit(n),因为调用main的运行时函数会将main的返回值当做 exit的参数。

你可能感兴趣的:(linux,网络,运维)