exit是一個庫函數,在進程正常結束時調用,
#include <stdlib.h>

 

void exit(int status);

 

_exit是一個系統調用,用來終止一個進程,
#include <unistd.h>

 

void _exit(int status);

 

exit與_exit都是用來正常退出進程,二者區別在於:
exit庫函數會先檢查進程打開檔的狀況,並且負責把檔案緩衝區中的內容寫回到檔中;
而_exit系統調用則不會。
所以調用_exit系統調用退出進程有可能會造成檔內容丟失。

 

這是因為linux標準函式程式庫,為了提高寫檔的效率,提供了一種緩衝I/O機制。
每打開一個檔,都會從記憶體中開闢一個緩衝區,
這樣寫檔時它會先寫到緩衝區中(並不是真正的寫磁片),
這樣可以節省大量的I/O操作帶來的頻繁的從使用者態往內核態切換的開銷。
緩衝I/O機制的目的是為了提高寫效率。

 

所以為了保證資料不會丟失,在進程退出時調用exit()函數會比較保險。
可以寫一個簡單的測試小程式來測試exit與_exit的差別。
#include <stdio.h>

 

int main(int argc, char *argv[])
{
printf("test exit\n");
exit(0);
}

 

由於標準I/O函數printf是行緩衝函數,所以有沒有'\n'是會對實際結果產生影響的。
因為是行緩衝,所以遇到分行符號時就會執行I/O操作。

 

linux系統進程終止的方式有正常退出和異常退出,
其中:
程式中調用exit或_exit或return掉都是屬於正常退出方式;
如果是程式調用了abort函數或收到了某個能使進程終止的signal比如SIGSEGV等都屬於異常退出。
創作者介紹

資訊園

shadow 發表在 痞客邦 PIXNET 留言(0) 人氣()