程序程式設計1 Unix環境高階程式設計7章讀書筆記

2021-04-14 03:22:51 字數 4675 閱讀 9151

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個退出函式:

atexit(void (*func)(void));

成功返回

0,錯誤返回非

0這些函式以註冊的逆序被呼叫。同乙個函式可以被註冊多次,並被呼叫多次。

每個程式都被傳入乙個環境列表,定義如下:

其實就是乙個字串陣列,每個元素都是乙個字串,表示乙個環境變數,如

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

上分配記憶體空間,優點是速度快而且不用釋放,但是不是所有系統都支援,並且使用的場合有限。

下列函式可以用來訪問環境變數:

getenv(const char *name);

putenv(char *str);

setenv(const char *name, const char *value, int rewrite);

unsetenv(const char *name);

成功返回

0,錯誤返回非01.

getenv

獲得環境變數的內容,如果沒有此變數則返回

null

2.putenv

接受用name=value

形式定義的引數,設定環境變數的值

3.setenv

設定name

的值為value

。如果rewrite=0

並且name

已經有值的話,不會設定

name

的值。 4.

unsetenv

刪除name的值

goto

可以跳轉到程式的另外的乙個地方,但是有在同乙個函式的限制。而

setjmp

和longjmp

提供了繞過此限制的跳轉功能:

setjmp(jmp_buf env);

直接呼叫者返回0,從

longjmp

返回則返回非

0

longjmp(jmp_buf env, int val);

1.在longjmp

應該返回的位置呼叫

setjmp

可以記住當前的函式的棧的相關資訊,並儲存到

env之中。如果返回

0,則是正常流程。如果返回非

0,說明剛從

longjmp

返回 2.

longjmp

調到之前

setjmp

所記住的位置

需要注意的是,

setjmp

主要紀錄棧的相關資訊以保證程式流程可以跳轉到

setjmp

的位置並繼續執行,因此只能保證棧指標的正確位置,不會導致棧被破壞,但是棧上的變數則無法保證會被恢復,這個和具體實現相關。如果你想保證某個自動變數(棧上的變數)不被恢復的話,可以定義其為

volatile。

getrlimit

和setrlimit

可以定義程序相關的資源限制:

getrlimit(int resource, struct rlimit *rlptr);

setrlimit(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 所註冊的退出...