[linux]进程控制——进程终止

一、main函数的返回值

我们在编写C语言的程序时,通常会这样写:

cpp 复制代码
int main()
{
    return 0;
}

那么我们为什么要返回(return)0 呢?

其实,main函数也是一个函数,它也会被调用,所以谁调用main函数,这个返回值就会返回给谁。

我们写一个test.c来观察:

cpp 复制代码
#include<stdio.h>


int main()
{
  //code


  return 3;
}

执行以上程序,我们可以看到return返回值写的是3。

我们可以通过 echo $? 查看进程退出码:

  • main函数的 返回值,就叫做进程的退出码。
  • 0 -> sucess (0表示成功)
  • !0 -> failed (!0表示失败);此时我们就可以用不同的数字表示不同的原因

main函数的退出码是可以被父进程获取的,用来判断子进程的运行结果。

注:

纯数字虽然能表明出原因,但是不便于人类的阅读,所以我们将 exit code -> exit code string(可以用内置的,也可以自定义)

例:打印Linux中的错误码信息(根据运行结果可以看出有133个)

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main()
{
  //code
  int i = 0;
  for(i = 0; i < 200; i++)
  {
    printf("%d: %s\n", i, strerror(i));
  }

  return 3;
}

我们运行的mybin文件就是bash的子进程。子进程退出时,退出码会被它的父进程自动获得。

echo $? 中,?中保存的是最近一个子进程执行完毕时的退出码。

例:

错误码是127

错误码是1

错误码与退出码

  • 错误码通常是衡量一个库函数或者是一个系统调用、一个函数的调用情况
  • 退出码通常是一个进程退出的时候,它的退出结果

相同的是,当失败的时候,用来衡量函数、进程出错时的出错详细原因。

二、进程终止

1、进程退出场景

  • 代码运行完毕,结果正确
  • 代码运行完毕,结果不正确
  • 代码异常终止

异常:

进程出现异常,本质是进程收到了对应的信号,自己终止了。

例:

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main()
{
  char* p = NULL;
  *p = 1;

  return 0;
  
}

运行后:

出现异常后,操作系统会根据发送的信号将该进程杀死。

Linux中:

那么,我们可以通过发送信号来终止一个进程 :

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

int main()
{
  while(1)
  {
    printf("进程: %d\n", getpid());
    sleep(1);
  }
  
  
  return 0;
}

程序运行:

此时,我们可以通过kill -11 27747 杀死该进程 (以 -11 为例,也可以是其它信号):

因此,一个进程是否出异常,我们只需看有没有收到信号即可。

2、exit(进程的退出码)

(任何时间,任何地点,exit,随时结束!)

任意地点调用exit,都表示进程直接退出,不进行后续执行。

exit:

  1. 执行用户通过 atexit或on_exit定义的清理函数。

  2. 关闭所有打开的流,所有的缓存数据均被写入

  3. 调用_exit

例:

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

int main()
{
  printf("test\n");

  exit(13);
  
  return 0;
}

3、_exit和exit

  • exit是库函数,_exit是系统调用
  • exit终止进程的时候,会自动刷新缓冲区;_exit终止进程的时候,不会自动刷新缓冲区

注:缓冲区不在操作系统内部。

相关推荐
夏日听雨眠3 小时前
LInux(逻辑地址与物理地址的区别,文件描述符,lseek函数)
linux·运维·网络
qq_542515415 小时前
Ubuntu 22.04.4 LTS安装ToDesk最新版打不开,无响应?旧版本4.7.2_277版本分享
linux·ubuntu·todesk
火车叼位5 小时前
替代 Tiny Win10 的 Linux 方案:Debian XFCE 精简桌面搭建
linux·运维
小麦嵌入式5 小时前
FPGA入门(四):时序逻辑计数器原理与 LED 闪烁实现
linux·驱动开发·stm32·嵌入式硬件·fpga开发·硬件工程·dsp开发
皮卡蛋炒饭.6 小时前
传输层协议UDP
linux·网络协议·udp
Dlrb12116 小时前
C语言-指针数组与数组指针
c语言·数据结构·算法·指针·数组指针·指针数组·二级指针
坚果派·白晓明6 小时前
【鸿蒙PC三方库移植适配框架解读系列】第一篇:Lycium C/C++ 三方库适配 — 概述与环境配置
c语言·开发语言·c++·harmonyos·开源鸿蒙·三方库·c/c++三方库
syagain_zsx6 小时前
Linux指令初识(实用篇)
linux·运维·服务器
王木风7 小时前
终端里的编程副驾:DeepSeek-TUI-项目深度拆解,实测与原理分析
linux·运维·人工智能·rust·node.js
槑槑紫7 小时前
windows系统装轻量版linux开发
linux·运维·服务器