標籤:style blog http io color ar 使用 sp strong
main函數之前會有一個特殊的啟動程式,啟動常式從核心取得命令列參數和環境變數。
正常終止:
- 從main函數返回
- 調用exit
- 調用_exit或_Exit
- 最後一個線程從啟動常式返回
- 最後一個線程調用pthread_exit
異常終止:
- 調用abort
- 接到一個訊號終止
- 最後一個線程對取消請求作出相應
exit函數
_exit和_Exit直接進入核心,exit則先執行一系列清理處理(調用終止處理常式,關閉所有標準io流),然後進入核心
#include<stdlib.h>
void exit(int status);
void _Exit(int status);
#include<unistd.h>
void _exit(int status);
status 終止狀態
atexit函數
登記函數
#include<stdlib.h>int atexit(void (*func)(void));exit調用這些函數的順序與它們登記的順序相反,登記多次也將執行多次
調用exec的進程可將命令列參數傳遞給該新程式。
extern char **environ;
本文段:cpu執行的機器指令部分。可共用初始化資料區段:明確的賦初值的變數。非初始化資料區段:bss段,任何程式外的C聲明棧:自動變數以及每次函數調用時需要儲存的資訊堆:動態儲存裝置的分配size命令報告報告本文段/資料區段/bss段
動態連結
#include<stdlib.h>void *malloc(size_t size);void *calloc(size_t nobj,size_t size);void *realloc(void *ptr,size_t newsize);void free(void *ptr);
#include<stdlib.h>char *getenv(const char *name);應使用geienv函數擷取指點環境變數的值,而不是直接使用environ。設定環境變數時只會影響當前進程及調用的子進程的環境,但不影響父進程的環境。#include <stdlib.h>int putenv(char *str);int setenv(const char* name,const char *value,int rewrite);int unsetenv(const char *name); putenv將字串直接放到環境表中,如果是自動變數會出現錯誤,setenv分配儲存區
- 修改現有的name
- 如果新的value比原來的短或者相等,可以直接放到原來的儲存區
- 如果長,就需要malloc新的儲存區
- 增加新的name
- 如果是第一次,則需要分配新的環境表格儲存體區,然後分配新的字串儲存區
- 如果不是第一次了,就realloc環境表的儲存區,然後直接分配新的字串儲存區就可以了。
goto是不能跨越函數的,只能在函數內部蹦達#include<setjmp.h>int setjmp(jmp_buf env);void longjmp(jmp_buf env,int val);首先,用setjmp定位要跳到什麼地方,setjmp返回的是longjmp第二個參數指定的數值,可以用來指定跳轉意圖。env一般聲明為全域變數,儲存調用longjmp時能用來恢複棧狀態的所有資訊。
第7章 進程環境