System-Calls

為什麼 execve 和 brk(NULL) 總是前兩個系統呼叫?

  • August 29, 2018

當我嘗試

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)第二個系統呼叫之外的東西。

引用自:https://unix.stackexchange.com/questions/464974