當核心執行c程式時(使用乙個exec函式執行),在呼叫mian函式前先呼叫乙個特殊的啟動例程。可執行程式檔案將此啟動例程指定為程式的起始位址。下面是c程式啟動和終止的流程,由圖中可以知道,程序的終止根據不同的函式呼叫是不一樣的,其中_exit和_exit函式是終止程序直接進入核心,exit函式則先執行一些清理,然後在進入核心。核心是程式執行的方法只有呼叫exec函式。虛線框裡面表示使用者程序。
unix中有8種程序終止方式,其中5種是正常終止,3種是異常終止。如下所示:
正常終止:
從main函式返回。
呼叫exit函式。
呼叫_exit或_exit函式。
最後乙個執行緒從其啟動例程返回。
最後乙個執行緒呼叫pthread_exit。
異常終止:
呼叫abort函式。
接到乙個訊號並終止。
最後乙個執行緒對取消請求做出響應。
exit函式
下面三個函式都是屬於正常終止程序,_exit和_exit直接進入核心,exit函式需要執行一些清理操作(例如終止處理程式、關閉標準i/o流等操作),然後才進入核心。
[cpp]view plain
copy
/* 正常終止程式函式 */
#include
void
exit(
intstatus);
//進入核心之前執行一些清理操作
void
_exit(
intstatus);
//直接進入核心
#include
void
_exit(
intstatus);
//直接進入核心
//引數status為終止狀態
atexit函式
exit函式自動呼叫終止處理程式函式,這些終止處理程式函式由atexit函式進行登記,exit根據atexit登記的順序,相反順序的呼叫終止處理程式函式,同乙個函式若登記多次,則exit函式就多次呼叫該函式。atexit函式的引數是乙個函式位址。
[cpp]view plain
copy
#include
intatexit(
void
(*func)(
void
));
//返回值:若成功則返回0,若出錯則返回非0值
測試exit的執行過程:
[cpp]view plain
copy
#include
#include
#include "apue.h"
static
void
my_exit1(
void
);
static
void
my_exit2(
void
);
intmain(
void
)
static
void
my_exit1(
void
)
static
void
my_exit2(
void
)
《unix高階環境程式設計》程序環境 環境變數
環境字串一般表示如下 cpp view plain copy name value 環境變數名,環境變數值 以下根據對環境變數不同的操作得到不同的結果,包括獲取環境變數當前值,新增環境變數,修改環境變數和刪除環境變數 相對應的函式分別為getenv putenv setenv和unsetenv函式,...
unix環境高階程式設計 守護程序
守護程序 daemon 是生存期長的一種程序,常常在系統引導裝入時啟動,僅在系統關閉時終止,因為它們沒有控制終端,unix有很多守護程序,它們執行日常事務活動。守護程序的特徵 執行指令 ps zxj a顯示其他使用者擁有的程序狀態,x顯示沒有終端控制的程序狀態,j顯示與作業有關的資訊 會話id 程序...
UNIX環境高階程式設計 守護程序
守護程序也稱精靈程序,是生存期較長的一種程序。它們通常在系統自舉時啟動,僅在系統關閉時才終止。因為它們沒有控制終端,所以它們都是在後台執行的。各標題意義 父程序id,程序id,程序組id,會話id,終端名稱,終端程序組id,使用者id 系統程序依賴於作業系統實現。父程序id為0的各程序通常是核心程序...