process environment
程序的終止有些下面的方法: 1.
從main
函式return
2.呼叫
exit
:exit
屬於iso c
標準中定義的函式,會執行清理工作。包括關閉
io庫中所有開啟的檔案流(這會導致所有的檔案
buffer
都被flush
),還會呼叫阿
texit
所註冊的退出函式。
exit
還會。等價於
return (0)
3.呼叫
_exit
或者_exit
:這兩個函式都不會執行清理工作,直接退出程序。
_exit
是posix.1
標準定義的函式,而
_exit
則是iso c
標準定義的函式。 4.
最後乙個執行緒從其執行緒函式
return
5.最後乙個執行緒呼叫
pthread_exit
非正常中止包括: 1.
abort
2.接收乙個
signal
3.最後乙個執行緒收到了
cancel請求
atexit
可以用來註冊多達
32個退出函式:
#include
intatexit(void (*func)(void));
成功返回
0,錯誤返回非0
這些函式以註冊的逆序被呼叫。同乙個函式可以被註冊多次,並被呼叫多次。
每個程式都被傳入乙個環境列表,定義如下:
extern char **environ;
其實就是乙個字串陣列,每個元素都是乙個字串,表示乙個環境變數,如
home=/home/sar,以0
結尾。而整個字串陣列也以
null
結尾。
1.text segment
2.initialized data segment(data segment)
,一般簡稱為
data
。用來專門存放已經初始化的資料,如
int maxcount = 99
3.uninitialized data segment
,一般簡稱為
bss,根據乙個很古老的彙編語句
bss(代表
block started by symbol
)命名。存放未初始化的資料,如
long sum[1000];
由核心自動初始化為0。
4.stack
,一般來說向低位址增長 5.
heap
,一般來說向高低址增長,和
stack
共用一塊空間
1.一般記憶體分配使用
malloc / calloc / realloc
,大家應該都很熟悉了,
calloc
和malloc
的區別是前者會初始化記憶體為
0,而後者不會。這些函式一般用
sbrk
系統呼叫實現。 2.
除了一般的
malloc/free
等記憶體分配函式之外,部分系統還提供了一些替代函式。值得一提的是
alloca
函式,這個函式從
stack
上分配記憶體空間,優點是速度快而且不用釋放,但是不是所有系統都支援,並且使用的場合有限。
下列函式可以用來訪問環境變數:
#include
char *getenv(const char *name);
intputenv(char *str);
intsetenv(const char *name, const char *value, int rewrite);
intunsetenv(const char *name);
成功返回
0,錯誤返回非0
1.getenv
獲得環境變數的內容,如果沒有此變數則返回
null
2.putenv
接受用name=value
形式定義的引數,設定環境變數的值 3.
setenv
設定name
的值為value
。如果rewrite=0
並且name
已經有值的話,不會設定
name
的值。
4.unsetenv
刪除name的值
goto
可以跳轉到程式的另外的乙個地方,但是有在同乙個函式的限制。而
setjmp
和longjmp
提供了繞過此限制的跳轉功能:
#include
char *setjmp(jmp_buf env);
直接呼叫者返回0,從
longjmp
返回則返回非
0
voidlongjmp(jmp_buf env, int val);
1.在longjmp
應該返回的位置呼叫
setjmp
可以記住當前的函式的棧的相關資訊,並儲存到
env之中。如果返回
0,則是正常流程。如果返回非
0,說明剛從
longjmp返回
2.longjmp
調到之前
setjmp
所記住的位置
需要注意的是,
setjmp
主要紀錄棧的相關資訊以保證程式流程可以跳轉到
setjmp
的位置並繼續執行,因此只能保證棧指標的正確位置,不會導致棧被破壞,但是棧上的變數則無法保證會被恢復,這個和具體實現相關。如果你想保證某個自動變數(棧上的變數)不被恢復的話,可以定義其為
volatile。
getrlimit
和setrlimit
可以定義程序相關的資源限制:
#include
intgetrlimit(int resource, struct rlimit *rlptr);
intsetrlimit(int resource, const struct rlimit *rlptr);
成功返回
0,錯誤返回非0
rlimit
結構定義如下:
struct rlimit
1.程序可以修改
soft limit
為比hard limit
小或者相等的任意值 2.
程序可以降低
hard limit
的值,但必須比
soft limit
大或者相等。注意
normal user
作這個操作是不可逆的 3.
只有super user
才可以增加
hard limit的值
4.無限可以用常數
rlim_infinity
5.注意
soft limit
是實際起作用的
limit
,而hard limit
是乙個限制值
limit
description
rlimit_as
程序最大可用記憶體,對
sbrk
系統呼叫有影響
rlimit_core
core
(記憶體轉儲,用於事後除錯)檔案的最大
size
rlimit_cpu
程序占用
cpu的最大時間,超過此限制的時候則傳送
sigxcpu signal
rlimit_data
資料的最大
size
,包括初始化資料,非初始化資料和
heap
rlimit_fsize
建立檔案的最大
size
,如果超過則傳送
sigxfsz signal
rlimit_locks
最大檔案鎖的數量
rlimit_memlock
最大用mlock
鎖定記憶體的
size
rlimit_nofile
開啟檔案的最大數量
rlimit_nproc
每個user id
的最大子程序數
rlimit_rss
最大常駐記憶體
size
。當記憶體不足時,核心會嘗試從記憶體使用量超過
rss的程序拿走一部分記憶體
rlimit_sbsize
乙個使用者所能使用的
socket
緩衝區的最大
size
rlimit_stack
stack
的最大size
rlimit_vmem
等價於rlimit_as
程序程式設計1 – unix高階環境程式設計7章讀書筆記
unix訊號(signal)程式設計 - unix高階環境程式設計第10章讀書筆記
使用pthread
庫進行多執行緒程式設計
1 - unix
環境高階程式設計第
11章讀書筆記 使用
pthread
庫進行多執行緒程式設計
2 - unix
高階環境程式設計第
12章讀書筆記
程序程式設計1 Unix環境高階程式設計7章讀書筆記
process environment 程序的終止有些下面的方法 1.從main 函式return 2.呼叫exit exit 屬於iso c 標準中定義的函式,會執行清理工作。包括關閉 io庫中所有開啟的檔案流 這會導致所有的檔案 buffer 都被flush 還會呼叫阿 texit 所註冊的退出...
程序程式設計1 Unix環境高階程式設計7章讀書筆記
process environment 程序的終止有些下面的方法 1.從main 函式return 2.呼叫exit exit 屬於iso c 標準中定義的函式,會執行清理工作。包括關閉 io庫中所有開啟的檔案流 這會導致所有的檔案 buffer 都被flush 還會呼叫阿 texit 所註冊的退出...
程序程式設計1 Unix環境高階程式設計7章讀書筆記
process environment 程序的終止有些下面的方法 1.從main 函式return 2.呼叫exit exit 屬於iso c 標準中定義的函式,會執行清理工作。包括關閉 io庫中所有開啟的檔案流 這會導致所有的檔案 buffer 都被flush 還會呼叫阿 texit 所註冊的退出...