2017-08-10 62 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