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等都屬於異常退出。