Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 中止函数如何永不返回?_C_Linux - Fatal编程技术网

C 中止函数如何永不返回?

C 中止函数如何永不返回?,c,linux,C,Linux,我在阅读abort()系统调用的手册页时遇到了这个问题 返回值 abort()函数永远不会返回 我想知道这是怎么可能的?调用abort函数会导致程序终止 因此,abort不会返回。调用abort函数会导致程序终止 因此,abort不会返回。许多C库函数永远不会返回到它们的调用者: exit()终止程序,提供退出状态 abort()以错误消息终止程序 longjmp()将控制权转移回相应的setjmp()保存的点。 汇编代码要么直接分支到与返回地址不同的地址,要么进行终止程序的系统调用。许多C

我在阅读
abort()
系统调用的手册页时遇到了这个问题

返回值

abort()
函数永远不会返回


我想知道这是怎么可能的?

调用
abort
函数会导致程序终止


因此,
abort
不会返回。

调用
abort
函数会导致程序终止


因此,
abort
不会返回。

许多C库函数永远不会返回到它们的调用者:

  • exit()
    终止程序,提供退出状态

  • abort()
    以错误消息终止程序

  • longjmp()
    将控制权转移回相应的
    setjmp()保存的点。


汇编代码要么直接分支到与返回地址不同的地址,要么进行终止程序的系统调用。

许多C库函数从未返回到它们的调用者:

  • exit()
    终止程序,提供退出状态

  • abort()
    以错误消息终止程序

  • longjmp()
    将控制权转移回相应的
    setjmp()保存的点。

汇编代码要么直接分支到与返回地址不同的地址,要么进行终止程序的系统调用。

一个“永不返回”的函数必须无条件执行以下五项操作之一:

  • 为(;;);输入一个无限循环(
  • 执行“非本地控制转移”,以使其他一些函数返回(
    longjmp
    swapcontext
  • 调用“系统调用”,使操作系统至少终止当前执行线程(
    pthread\u exit
    \u exit
    重新启动
  • 执行某种禁止或无效的机器操作(无效指令、访问未映射内存等),再次导致操作系统终止进程
  • 调用执行上述操作之一的其他函数
  • abort
    通常是5->3,4和作为最后手段1的组合,因为它的合同是在事情已经严重出错后终止进程:它尝试的第一件事(通常是
    kill(getpid(),SIGABRT)
    )不可能起作用

    在较低的层次上,我们可以讨论“执行线程”实际上是什么,操作系统如何设置和删除它们,操作系统本身是如何由引导加载程序调用的程序,如果你以正确的方式看它,“运行程序”只是动态修改操作系统的代码以包含程序的代码,然后跳转到它。。。但是,也许你不想让我在这个答案框中罗列整个操作系统课程。

    一个“永不返回”的函数必须无条件地完成以下五件事之一:

  • 为(;;);输入一个无限循环(
  • 执行“非本地控制转移”,以使其他一些函数返回(
    longjmp
    swapcontext
  • 调用“系统调用”,使操作系统至少终止当前执行线程(
    pthread\u exit
    \u exit
    重新启动
  • 执行某种禁止或无效的机器操作(无效指令、访问未映射内存等),再次导致操作系统终止进程
  • 调用执行上述操作之一的其他函数
  • abort
    通常是5->3,4和作为最后手段1的组合,因为它的合同是在事情已经严重出错后终止进程:它尝试的第一件事(通常是
    kill(getpid(),SIGABRT)
    )不可能起作用


    在较低的层次上,我们可以讨论“执行线程”实际上是什么,操作系统如何设置和删除它们,操作系统本身是如何由引导加载程序调用的程序,如果你以正确的方式看它,“运行程序”只是动态修改操作系统的代码以包含程序的代码,然后跳转到它。。。但也许你不想让我在这个答题箱里罗列整个操作系统课程。

    操作系统魔术
    abort
    将控制权交给操作系统,操作系统会终止进程,因为它会关闭程序。有什么可以返回的呢?
    exit()
    函数也不会返回(如果您熟悉C99和C11标准,也不会返回
    \u exit()
    quick\u exit()
    abort
    将控制权交给操作系统,操作系统会终止进程,因为它会关闭程序。有什么可以返回的呢?
    exit()
    函数也不会返回(如果您熟悉C99和C11标准,也不会从POSIX返回
    \u exit()
    quick\u exit()
    )。