你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> C++ 中exit(),_exit(),return,abort()函數的區別

C++ 中exit(),_exit(),return,abort()函數的區別

編輯:IOS開發綜合

exit()函數與_exit()函數及return關鍵字的區別:

  exit()和_exit()函數都可以用於結束進程,不過_exit()調用之後會立即進入內核,而exit()函數會先執行一些清理之後才會進入內核,比如調用各種終止處理程序,關閉所有I/O流等,我建議直接在Linux的終端中查看man手冊,手冊的內容是最官方的,而且不會有錯,手冊的英文是為全世界的程序員做的,所以手冊的英語不會難。

1. 實例代碼:

#include <unistd.h>

    void _exit(int status);

    #include <stdlib.h>

    void _Exit(int status);

 DESCRIPTION
    The function _exit() terminates the calling process
    "immediately". Any open file descriptors belonging to
    the process are closed; any children of the process are
    inherited by process 1, init, and the process's parent
    is sent a SIGCHLD signal.

    The value status is returned to the parent process as
    the process's exit status, and can be collected using
    one of the wait() family of calls.

  這是手冊對_exit()函數的描述,意思是_exit()函數終止調用的進程,進程所有的文件描述符(在linux中一切皆文件)都被關閉, 這個進程的所有子進程將被init(最初的進程,所有的進程都是來自init進程,所有的進程都由其父進程創建,即init進程是所有進程的祖先!)進程領養,並且這個終止的進程將向它的父進程發送一個sigchld信號。_exit()的參數status被返回給這個終止進程的父進程來作為這個終止進程的退出狀態,這個退出狀態值能被wait()函數族的調用收集(就是通過wait()函數來獲得子進程的退出狀態,之後wait()函數將會釋放子進程的地址空間,否則會出現zoom進程)。

  _exit()函數是系統調用。會清理內存和包括pcb(內核描述進程的主要數據結構)在內的數據結構,但是不會刷新流,而exit()函數會刷新流。比如exit()函數會將I/O緩沖中的數據寫出或讀入(printf()就是I/O緩沖,遇到‘\n'才會刷新,若直接調用exit()則會刷新,而_exit()則不會刷新)。

  2.實例代碼:

#include <stdlib.h>

    void exit(int status);

DESCRIPTION
    The exit() function causes normal process termination
    and the value of status & 0377 is returned to the parent
    (see wait(2)).

這是man手冊中對exit()函數的秒數,exit()函數導致子進程的正常退出,並且參數status&0377這個值將被返回給父進程。exit()應該是庫函數。exit()函數其實是對_exit()函數的一種封裝(庫函數就是對系統調用的一種封裝)。

 3.return 不是系統調用,也不是庫函數,而是一個關鍵字,表示調用堆棧的返回(過程活動記錄),是函數的退出,而不是進程的退出。

  return函數退出,將函數的信息返回給調用函數使用,與exit()和_exit()函數有本質區別。

4.abort()函數。


 #include <stdlib.h>

    void abort(void);

DESCRIPTION
    The abort() function causes abnormal program termination
    unless the signal SIGABRT is caught and the signal han-
    dler does not return. If the abort() function causes
    program termination, all open streams are closed and
    flushed.

    If the SIGABRT signal is blocked or ignored, the abort()
    function will still override it.

 

  abort()函數用於異常退出。返回一個錯誤代碼。錯誤代碼的缺省值是3。abort()函數導致程序非正常退出除非sigabrt信號被捕捉到,並且信號處理函數沒有返回(即abort()函數給自己發送sigabrt信號),如果abort()函數導致程序終止,所有的打開的流將被關閉並且刷新。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved