따라서협회, 널 포인터로 인수 목록을 종료해야 합니다. 이는 다음과 같이 표현됩니다.
매개변수 목록은 널 포인터로 끝나야 합니다.
내 질문은 왜 널 포인터로 매개변수 목록을 종료해야 합니까? 매개변수 목록의 끝을 알고 싶기 때문에 사용하십시오. 이것은 char에 대한 포인터 배열입니까?
답변1
널 포인터로 인수 목록을 종료해야 하는 이유는 무엇입니까? 매개변수 목록의 끝을 알고 싶기 때문에 사용하십시오. 이것은 char에 대한 포인터 배열입니까?
예. 환경 변수 배열의 경우에도 마찬가지입니다. 커널은 호출 프로세스에서 복사할 데이터의 양을 알아야 하며 시스템 호출은 이러한 배열의 요소 수에 대한 명시적인 매개 변수를 제공하지 않습니다. (물론 명시적 매개변수로 전달하는 것도 가능합니다.)
답변2
따라서 우선 exec()
시스템 호출이 없습니다. exec()
일련의 관련 API를 참조하는 데 사용되는 기호입니다.execve()
시스템 호출그리고 그룹라이브러리 기능이 시스템 호출 위에. 라이브러리 함수는 종종 유용한 작은 API 변형을 제공합니다.
일부~의라이브러리 기능l
---가 붙은 함수 이름은 가변 매개변수 함수입니다. 목록으로 실행될 프로그램에 대한 명령줄 인수를 지정할 수 있습니다(평상복길이) 함수 호출에서. 목록 끝에 있는 널 포인터를 사용하면 함수가 목록의 끝이 어디에 있는지 확인할 수 있습니다. (이러한 매개변수가 저장되는 위치는 구현에 따라 다릅니다. 다음을 참조하세요.함수의 va_arg 매개변수가 스택 메모리 또는 힙 메모리에 저장되어 있습니까?)
라이브러리 함수는 내부적으로 argv
올바른 크기의 배열을 할당하고 배열을 문자열에 대한 포인터로 채웁니다(그리고 NULL
배열의 마지막 요소로 a를 추가합니다 argv
). 그런 다음 구성의 내용이 (결국) argv
호출에 전달됩니다 execve()
.