2017-10-07 1 views
1

아니면 함수 호출입니까? 함수 호출이 프로그램 내에서 호출되는 동안 시스템 호출은 시스템에서 서브 루틴 빌드에 대한 호출임을 알고 있습니다.프로그램은 리눅스에서 환경 변수의 값을 얻기 위해 시스템 호출을합니까?

+0

안녕하세요. 이것은 프로그래밍과 관련이 없으므로 주제와 관련이 없습니다. 읽어 보시기 바랍니다 : https://stackoverflow.com/help/on-topic –

+0

리눅스에서 glibc로 구현 한 것 같습니다. 나는 그것이 glibc에서 상응하는'syscall '을 수반하는지 모른다. 내가 그 프로세스의 환경 블록에서 사용할 수 있다고 믿은 이후로 나는 용의자가 아니다. GNU C 라이브러리 매뉴얼의 [25.4.1 환경 액세스] (https://www.gnu.org/software/libc/manual/html_node/Environment-Access.html)도 참조하십시오. – jww

+1

@MaciejJureczko 전 완전히 당신에 동의하지 않습니다. 이것은 정확히 SO가 대답하려고했던 질문과 같습니다. 초보자가 프로그래밍에 대해 이해하려고합니다. –

답변

2

환경 변수를 읽을 때 시스템 호출이 수행되지 않습니다.

C API 수준에서 환경 변수는 세 번째 인수로 main으로 전달됩니다. 완성 된 프로토 타입은 다음과 같습니다.

이 방법으로 main을 정의하면 환경을 읽는 데 함수 호출이 필요하지 않습니다.

다음 프로그램의 인쇄 환경 변수의 모든 : 물론

#include <stdlib.h> 
#include <stdio.h> 

int main(int argc, char *argv[], char *envp[]) { 
    while(*envp) { 
     printf("%s\n", *envp); 
     envp++; 
    } 

    return 0; 
} 

, main는 컴파일러의 런타임 지원 라이브러리에 의해 발명 뭔가입니다. OS에 관한 한 인터페이스는 다소 다릅니다. 그러나 같은 원칙이 여전히 남아 있습니다. 환경은 스택에 execve 이후에 새로 생성 된 프로그램에 전달됩니다.

getenvchar *을 반환하는 이유이기도합니다. 아무것도 배정 할 필요가 없습니다. 이미 문자열이 있습니다.

편집 됨 : 시스템 호출시 특정 함수가 결과로 나오는지 여부를 아는 것은 매우 간단합니다. 코드 위에서 strace을 실행하기 만하면됩니다. strace은 모든 시스템 호출 만 트랩합니다. getenv 함수 호출이 보이지 않는 경우에는 시스템 호출이 아닙니다.

관련 문제