天天看點

《APUE》讀書筆記—第七章程序環境

  本章主要介紹了unix程序環境,包含main函數是如何被調用的,指令行參數如何傳遞,存儲方式布局,配置設定存儲空間,環境變量,程序終止方法,全局跳轉longjmp和setjmp函數及程序的資源限制。

  main函數的原型為int main(int argc,char *argv[]);其中argc是指令行參數的數目,argv是指向參數的各個指針構成的數組。當核心執行c程式時,使用一個exec函數,在調用main函數前線調用一個特殊的啟動例程,從核心擷取指令行參數和環境變量。

  程序終止分為正常終止和異常終止。正常終止包括:(1)從main傳回,(2)調用exit();(3)調用_exit或者_exit();(4)最後啟動一個線程從其啟動例程傳回;(5)最後一個線程調用pthread_exit。異常終止包括:(1)調用abort();(2)接收到一個信号并終止;(3)最後一個線程對取消請求做出響應。

1、exit函數系列:_exit和_exit函數立即進入核心,而exit函數則執行清理處理(如關閉标準i/o流,執行各終止處理程式)。在main函數執行return (0)與exit(0)是等價的。

#include <unistd.h>

void _exit(int status);

#include <stdlib.h>

void exit(int status);

 2、atexit函數,用來登記終止處理程式,一個程序可以登記多達32個函數,這些函數将有exit自動調用,調用順序與登記順序相反,同一個函數可以登記多次,則也會被調用多次。函數原型如下:

int atexit(void (*function)(void));  //成功傳回0,否則傳回非0值

一個c程式啟動和終止的過程如下圖所示:

《APUE》讀書筆記—第七章程式環境

核心使程式執行的唯一方法是調用一個exec函數,終止的唯一方法是顯式或者隐式地通過exit函數調用_exit()或_exit(),也可以非自願的由一個信号使其終止。

寫個程式程序練習,程式如下:

《APUE》讀書筆記—第七章程式環境
《APUE》讀書筆記—第七章程式環境
《APUE》讀書筆記—第七章程式環境

程式執行結果如下:

《APUE》讀書筆記—第七章程式環境

  指令行參數,當執行一個程式時,調用exec的程序可将指令行參數傳遞給該新程式,程序間通信資料傳輸程序用到。寫個程式輸出其指令行參數,程式如下:

《APUE》讀書筆記—第七章程式環境
《APUE》讀書筆記—第七章程式環境

測試結果如下:

《APUE》讀書筆記—第七章程式環境

c程式的存儲空間布局:

《APUE》讀書筆記—第七章程式環境

存儲器配置設定函數:

void *malloc(size_t size);

void *calloc(size_t nmemb,size_t size);

void *realloc(void *ptr, size_t size); //更改以前配置設定區的長度

void free(void *ptr);

寫個程式練習函數的使用:

《APUE》讀書筆記—第七章程式環境
《APUE》讀書筆記—第七章程式環境

環境變量:形式為name=value,環境變量可以在用程序程序間通信,exec函數可以通過環境變量程序傳參數,例如在cgi程式中用到http協定get和post方法對應的環境變量。環境變量可用于所有的子程序,這包括編輯器、腳本和應用。環境變量操作函數如下:

char *getenv(const char *name); //指向與name關聯的value的指針

int putenv(char *string);  //取形式為name=value的字元串,将其放到環境表中

int setenv(const char *name, const char *value, int overwrite); //将name設定為value

int unsetenv(const char *name);  //删除name的定義

int clearenv(void); //删除環境表中所有項

寫個程式進行環境變量的讀取設定及删除。程式如下:

《APUE》讀書筆記—第七章程式環境
《APUE》讀書筆記—第七章程式環境
《APUE》讀書筆記—第七章程式環境

 程式執行結果如下:

《APUE》讀書筆記—第七章程式環境

全局跳轉函數setjmp和longjmp:解決跨越函數跳躍,處理發生在深層次嵌套函數調用中出錯情況非常有用。全局或者靜态變量的值在執行longjmp是保持不變。函數原型如下:

int clearenv(void);

#include <setjmp.h>

int setjmp(jmp_buf env);  //傳回值為0為直接調用,從longjmp調用傳回非0值

int sigsetjmp(sigjmp_buf env, int savesigs);

  一般用法是:設定一個全局的jmp_buf變量,在主程序中調用setjmp()設定跳轉變量,如果後面的函數出現錯誤,調用longjmp設定一個值,說明函數調用出錯。寫個程式來表達用法,程式如下:

《APUE》讀書筆記—第七章程式環境
《APUE》讀書筆記—第七章程式環境
《APUE》讀書筆記—第七章程式環境
《APUE》讀書筆記—第七章程式環境

程序資源限制函數:getrlimit和setrlimit,資源結果和函數原型如下:

struct rlimit {

    rlim_t rlim_cur;  /* soft limit */

    rlim_t rlim_max;  /* hard limit (ceiling for rlim_cur) */

};

#include <sys/resource.h>

int getrlimit(int resource, struct rlimit *rlim);

int setrlimit(int resource, const struct rlimit *rlim);

關于程序資源限制目前還不知道有何用,以後再來補充。

繼續閱讀