本文使用golang的syscall,os,golang.org/x/sys/unix包main是程式的入口,golang中也亦是如此
啟動乙個程式時啟動例程負責從核心獲取命令列引數和環境變數,維護到程式的記憶體布局中(後文描述)
//import os
func exit(code int)
使程式主動退出,令退出碼為指定值code,程式正常結束時返回碼為0 (在一般的shell中使用$?獲取)
atexit函式,golang中未實現
#include
int atexit(void (*func)(void)));
//import os
var args string
程式啟動時命令列跟隨的引數
shell中可使用size命令檢視二進位制程式的正文段,初始化段,bss段
作業系統所支援的一種庫操作,使得程式與儲存中的共享庫連線,減小了程式的大小,但略微增加了程式執行開銷(在程式第一次執行或每個共享庫第一次被呼叫)
golang共享庫 待補充。。
原文中提到的是malloc caloc realloc,實際在golang中應使用make new
//builtin
func make(t type, size ...integertype) type
func new(type) *
type
//import golang.org/x/sys/unix
func getenv(key string) (value
string, found bool)
func setenv(key, value
string) error
由[4.c程式的儲存空間布局],我們已知環境變數在棧之上(程序儲存空間頂部),且由乙個**char的指標列表來維護,且該空間不可伸縮,當要新增環境變數時會導致一些儲存變化
分3種情況討論
增加乙個環境變數:
c中跨越函式goto的高階玩法,通常適用於一些深層巢狀的函式
#include
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);
jmp_buf變數通常使用全域性變數,是乙個某種形式的陣列,儲存恢復棧狀態時所需要的資訊。
longjmp回跳時需要提供這個buf以便找到要恢復的位置。
longjmp還需要提供乙個整型值,以通知setjmp的返回值,直接呼叫setjmp返回的值為0
longjmp後會拋棄掉呼叫setjmp的函式棧幀一下的所有棧幀
關於longjmp後變數值的問題:存放在儲存器中的值(通常為記憶體)保持longjmp時的值,而cpu和浮點暫存器的值恢復到setjmp時的狀態
type rlimit struct
func getrlimit(resource int, rlim *rlimit) (err error)
func setrlimit(resource int, rlim *rlimit) (err error)
cur決定當前實際的限制值
關於rlimit結構,存在3個規則:
APUE 程序環境
mian函式 c程式總是從main函式開始執行。main函式的原型是 int main int argc,char argv 其中,argc是命令列引數的數目,argv是指向引數的各個指標所構成的陣列。當核心執行c程式時,在呼叫main之前先呼叫乙個特殊的啟動例程。可執行程式檔案將此啟動例程指定為程...
APUE 程序環境
本文章介紹程序的環境 1.main函式 c程式總是從main函式開始執行的,其原型是 int main int argc,char argv argc是命令列引數的個數 argv是指向引數的各個指標所構成的陣列 2.程序終止 有8種方式可以讓程序終止,其中前5種為正常終止 1.從main返回 2.呼...
APUE自學筆記 程序環境
c程式執行時,最開始執行的是啟動 啟動 再去呼叫main函式,然後整個c程式都已執行。由編譯器提供的,一般有兩種提供方式 原始碼 二進位制 gcc採用這種 gcc v 檔名 可以檢視gcc編譯鏈結的詳細情況時,可以看到有很多 o,這些 o檔案就是gcc提供的啟動 在程式的記憶體空間結構還沒有布局起來...