2017-08-10 74 views
0

我正在阅读系统调用abort()的手册页,我碰到过这个问题。中止函数如何不再返回?

返回值

abort()函数永远不会返回。

我在想这怎么可能?

+1

操作系统神奇。 'abort'将控制权交给操作系统,操作系统终止您的进程 – litelite

+2

因为它关闭了程序。会有什么回报? – AntonH

+2

exit()函数永远不会返回(如果你使用C99和C11标准,也不使用'_Exit()'或'quick_exit()',也不会返回POSIX中的'_exit()')。 –

回答

2

调用abort函数会导致程序被终止。因此,abort不会返回。

2

许多C库函数永远不会返回给调用者:

  • exit()终止程序,提供了一个退出状态。

  • abort()终止程序并显示错误消息。

  • longjmp()将控制转移回到由相应setjmp()

汇编代码要么保存分支点直接从返回地址不同的地址或进行系统调用终止该程序。

1

说:“永远不会返回”必须无条件做这五两件事之一的功能:

  1. 进入无限循环(for(;;);
  2. 执行“控制的非局部转移”,使得一些其他函数似乎返回(longjmp,swapcontext
  3. 调用导致操作系统至少终止当前执行线程的“系统调用”(pthread_exit,_exitreboot
  4. 执行某种禁止或无效的机器操作(无效的指令,访问映射的内存等),再次导致操作系统终止进程
  5. 调用,它上面的东西一个其他一些功能。

abort通常是5-> 3,4一些组合,并作为最后的手段1,因为其合同终止进程事情都已经走了可怕的错误:它不是出了问题它尝试的第一件事(通常是kill(getpid(), SIGABRT))将不起作用。

在较低的层次上,我们可以谈论一个“执行线程”究竟是什么,操作系统如何设置它们并将它们关闭,以及操作系统本身是如何由引导加载程序调用的程序,如果你以正确的方式眯起来,“运行程序”只是动态地修改操作系统的代码,以包含程序的代码,然后跳转到该程序。但也许你不希望我在这个答案框中放弃整个操作系统课程。

+0

感谢您的详细解释,但@dbush的回答非常简短。 – adarsh