2017-10-07 58 views
1

或者它是一個函數調用?我知道系統調用是對系統中構建子程序的調用,而函數調用是程序中的調用。程序是否會進行系統調用以獲取linux中環境變量的值?

+0

歡迎來到SO。這不是與編程相關的,因此不涉及主題。請閱讀:https://stackoverflow.com/help/on-topic –

+0

我相信它是由Linux上的glibc實現的。我不知道它是否需要來自glibc的相應'syscall'。我懷疑不是因爲我相信它在環境塊中的可用性。另請參閱GNU C庫手冊中的[25.4.1環境訪問](https://www.gnu.org/software/libc/manual/html_node/Environment-Access.html)。 – jww

+1

@MaciejJureczko我完全不同意你。這正是所要回答的問題:一位嘗試瞭解編程的新手。 –

回答

2

讀取環境變量時沒有系統調用完成。

在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 *。它不需要分配任何東西。它已經有了字符串。

編輯添加:知道是否有任何特定功能導致系統調用(和哪個)是相當簡單的。你所要做的就是在代碼上運行stracestrace陷阱全部(且僅限)系統調用。如果您的getenv函數調用不可見,則它不是系統調用。

相關問題