linux下exit系統調用

來源:互聯網
上載者:User

原文地址:http://blog.sina.com.cn/s/blog_4850a7880100hncm.html

參考:http://lzjyjh.blog.sohu.com/137646727.html

———————————————————————————————————————————————

在Unix OS中,通過執行系統調用exit來終止一個進程。進程可以顯示的調用exit系統調用來終止一個進程,也可以通過在程式結束時的return來實現(startup
routine調用exit當一個C程式從main函數返回時)。

調用exit方式如下:

        exit(status);

status是返回給父進程終止code。當一個進程exit後,這個進程處於zombie
state

exit系統調用的執行發生以下事件:

1.清除當前進程的所有訊號處理函數。

2.如果當前進程是和終端關聯的“進程組組長”,則會向每個組內進程發送hang-up
signal
,並且把這些成員的進程組設定為0。

3.通過核心內部演算法關閉當前進程所有開啟的檔案描述符,並且釋放目前的目錄所關聯的inode;如果存在current
(charged)root,也將其釋放通過演算法iput。

4.為進程釋放所有的region以及關聯的memory

5.計算進程機器子進程執行的時間(user
mode 和kernel mode),並把記錄寫到一個全域的accounting file。

6.將進程的狀態改變為zombie,並將自己的所有的子進程的父進程ID設定為1(init);如果有孩子的狀態是zombie,向init進程發SIGCHLD訊號,以清除子進程的process
table slot

7.exiting進程向自己的父進程發送SIGCHLD訊號。

8.進行context
switch,調度其他非zombie進程(本進程已經是zombie)。

 

在討論exit與_exit之前,先來討論檔案記憶體緩衝區的問題。

   在linux中,標準輸入輸出(I/O)函數都是作為檔案來處理。對應於開啟的每個檔案,在記憶體中都有對應的緩衝,每次讀取檔案時,會多讀一些記錄到緩衝中,這樣在下次讀檔案時,就在緩衝中讀取;同樣,在寫檔案時也是寫在檔案對應的緩衝中,並不是直接寫入硬碟的檔案中,等滿足了一定條件(如達到一定數量,遇到分行符號\n或檔案結束標誌EOF)才將資料真正的寫入檔案。這樣做的好處就是加快了檔案讀寫的速度!但這樣也帶來了一些問題:比如有一些資料,我們認為已經寫入了檔案,但實際上沒有滿足一定條件而任然駐留在記憶體的緩衝中,這樣,如果我們直接用_exit()函數直接終止進程,將導致資料丟失!!

   也許細心地讀者已經發現前面使用的是_exit而不是exit,如果改成exit,就不會有資料丟失的問題出現了,這就是我要說的它們之間的區別了!要解釋這個問題,就要涉及它們的工作步驟了。

   exit():在執行該函數時,進程會檢查檔案開啟情況,清理I/O緩衝,如果緩衝中有資料,就會將它們寫入相應的檔案,這樣就防止了檔案資料的丟失!然後終止進程。

   _exit():在執行該函數時,並不清理標準輸入輸出緩衝,而是直接清除記憶體空間,當然也就把檔案快取中尚未寫入檔案的資料給銷毀了。由此可見,使用exit()函數更加安全。

   此外,對於它們兩者的區別還有各自的標頭檔不同:exit()--stdlib.h   _exit()--unistd.h

   最後提一下,一般情況下exit(0)表示正常退出,exit(1),exit(-1)為異常退出,0、1、-1是傳回值,具體含義可以自定.

   exit好象在stdio.h裡面,所以要有包含標頭檔  
  return是返回函數調用,如果返回的是main函數,則為退出程式  
  exit是在調用處強行退出程式,運行一次程式就結束  
  -------------------------------------------------------------------  
  return  
   
  是返回  
   
  函數返回  
  而exit是退出
  
  -------------------------------------------------------------------  
  exit(1)表示異常退出.這個1是回給作業系統的不過在DOS好像不需要這個傳回值  
  exit(0)表示正常退出  
  -------------------------------------------------------------------  
  無論寫在那裡,都是程式推出,dos和windows中沒有什麼不一樣,最多是系統處理的不一樣。  
  數字0,1,-1會被寫入環境變數ERRORLEVEL,其它程式可以由此判斷程式結束狀態。  
  一般0為正常推出,其它數字為異常,其對應的錯誤可以自己指定。  
  -------------------------------------------------------------------  
  返回給作業系統的,0是正常退出,其他值是異常退出,在退出前可以給出一些提示資訊,或在偵錯工具中察看出錯原因.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.