APUE 程序環境

2021-08-08 20:53:59 字數 1875 閱讀 4991

本文使用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提供的啟動 在程式的記憶體空間結構還沒有布局起來...