c语言exi函数用法(c语言退出程序命令exi)

生活常识 2023-04-30 10:08生活常识www.baidianfengw.cn

  使用C/C++语言在UNIX或者Linux系统下编程,应该都会遇到很多的进程退出相关的函数。有些是C标准库提供的函数,有些是系统调用,有些又是某个系统所独有的系统调用或者函数,并且命名上也极为类似,给人眼花缭乱的感觉。

  这篇文章尝试去下其中常见的那几个系统调用和函数,并通过一个例子来展示下基本用法。

  进程退出系列系统调用/函数_exit

  _exit(2) 属于 POSIX 系统调用,适用于 UNIX 和 Linux 系统。调用该系统调用后会导致当前进程直接退出,且函数不会返回。内核会关闭该进程打开的文件描述符,若还存在子进程,则交由1号进程领养,再向进程的父进程发送 SIGCHLD 信号。

  函数原型如下

  参数列表

  – `status`: 进程退出码

  返回值

  无返回值

  exit_group

  exit_group(2) 是 Linux 系统所独有的系统调用,调用后会使得进程的所有线程都退出。从 glibc 2.3 开始,_exit 实际上是对 exit_group 系统调用的包装。,在Linux系统上两者是等价的。

  函数原型如下

  参数列表

  – `status`: 进程退出码

  返回值

  无返回值

  _Exit

  _Exit(3) 是C标准库函数,功能上等价于 _exit 系统调用,由 C99 引入。由于是标准库提供的函数,在跨平台移植性上比 _exit 好,建议优先使用。

  函数原型如下

  参数列表

  – `status`: 进程退出码

  返回值

  无返回值

  exit

  exit(3) 是C标准库函数,也是最常用的进程退出函数。它区别于 _exit、_Exit 的地方在于,除了使进程退出(也是通过调用 _exit 系统调用实现的)这个核心功能外,它还会执行一些前置动作

  逐个执行用户注册的自定义清理函数(通过 atexit 或者 on_exit 函数注册)刷新标准I/O流缓冲区并关闭删除由标准库函数 tmpfile 创建的临时文件

  函数原型如下

  参数列表

  – `status`: 进程退出码

  返回值

  无返回值

  atexit

  atexit(3) 是C标准库函数,用于注册进程退出清理函数。该函数在使用时有以下几个注意点

  清理函数的执行顺序与注册顺序相反。当进程收到致命信号时,注册的清理函数不会被执行。当进程调用 _exit(或者 _Exit)时,注册的清理函数不会被执行。当执行到某个清理函数时,若收到致命信号或者清理函数内调用了 _exit(或者 _Exit),那么该清理函数不会返回并且后续的其它清理函数也会被丢弃。当同一个清理函数被注册多次,那么正常情况下该清理函数也会被执行相应的次数。父进程在调用 fork 前注册了清理函数,那么这些清理函数也会被子进程所继承;若子进程后续又调用了 exec 系列函数,那么子进程所继承的清理函数则会被移除。单个进程能够注册的清理函数的数量不会少于32个。

  函数原型如下

  参数列表

  – `function`: 用户自定义的进程退出清理函数。

  返回值

  成功返回0,非0值则表示失败。

  on_exit

  功能上与 atexit 函数类似的,还有on_exit(3)函数。它是 Linux 系统下所独有的函数,用于注册进程退出清理函数,区别于 atexit 函数的是,它支持了额外的入参。

  函数原型如下

  参数列表

  – `function`: 用户自定义的进程退出清理函数。

  – `arg`: `void `类型的自定义参数。

  返回值

  成功返回0,非0值则表示失败。

  示例

Copyright@2015-2025 白癜风网版板所有