System-Calls
為什麼 execve 和 brk(NULL) 總是前兩個系統呼叫?
當我嘗試
strace ping google.com
或者
strace ls
或者
even strace curl <domain>
前兩個系統呼叫總是,
execve("/usr/bin/curl", ["curl", "google.com"], 0x7ffecf1bc378 /* 61 vars */) = 0 brk(NULL) = 0x55f553c49000
有人可以告訴我,當我執行任何操作時,execve 是否總是第一個系統呼叫?
我閱讀了這個手冊頁,https://linux.die.net/man/2/execve 但不明白它
execve
是否真的是系統呼叫或可執行程序?
在 Linux 中,通過 創建一個新程序
fork()
,它創建了一個與父程序幾乎相同的子程序。要創建一個程序與原程序的程序不同的新程序,新的子程序立即呼叫execve()
,這基本上就是說“用這個其他程序替換我目前的程序”的程序。
brk(NULL)
是詢問其堆記憶體在哪裡結束的程序。許多程序將此稱為它們的第一個系統呼叫(將在 之後立即顯示execve()
),因為它們malloc()
立即使用(或它們在內部使用的庫呼叫malloc()
)。如果程序及其庫呼叫暫時不需要呼叫malloc()
,那麼除了brk(NULL)
第二個系統呼叫之外的東西。