1
或者它是一個函數調用?我知道系統調用是對系統中構建子程序的調用,而函數調用是程序中的調用。程序是否會進行系統調用以獲取linux中環境變量的值?
或者它是一個函數調用?我知道系統調用是對系統中構建子程序的調用,而函數調用是程序中的調用。程序是否會進行系統調用以獲取linux中環境變量的值?
讀取環境變量時沒有系統調用完成。
在C API級別上,環境變量作爲第三個參數傳遞給main
。完整的原型是:
int main(int argc, char *argv[], char *envp[])
如果以這種方式定義主體,甚至不需要函數調用來讀取環境。
下面的程序打印所有的環境變量:
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[], char *envp[]) {
while(*envp) {
printf("%s\n", *envp);
envp++;
}
return 0;
}
當然,main
是隻是一些你的編譯器的運行時支持庫發明的。就操作系統而言,界面有所不同。然而,同樣的原則依然存在。在其堆棧上的execve
之後,環境傳遞到新創建的程序。
這也是爲什麼getenv
返回char *
。它不需要分配任何東西。它已經有了字符串。
編輯添加:知道是否有任何特定功能導致系統調用(和哪個)是相當簡單的。你所要做的就是在代碼上運行strace
。 strace
陷阱全部(且僅限)系統調用。如果您的getenv
函數調用不可見,則它不是系統調用。
歡迎來到SO。這不是與編程相關的,因此不涉及主題。請閱讀:https://stackoverflow.com/help/on-topic –
我相信它是由Linux上的glibc實現的。我不知道它是否需要來自glibc的相應'syscall'。我懷疑不是因爲我相信它在環境塊中的可用性。另請參閱GNU C庫手冊中的[25.4.1環境訪問](https://www.gnu.org/software/libc/manual/html_node/Environment-Access.html)。 – jww
@MaciejJureczko我完全不同意你。這正是所要回答的問題:一位嘗試瞭解編程的新手。 –