처음에는 exec(3)과 그 친구들이 실행 파일의 경로와 변수에 대한 포인터의 가변 길이 목록을 허용했습니다. 정상적인 운영 체제에서 시작되는 프로세스는 각 단어에 대한 포인터와 개별 문자열을 포함하는 인수 목록에 한 지점을받습니다. 일반 쉘은 명령 행을 구문 분석하고 exec (3)에 필요한 인수 목록을 채 웁니다.
exec ("some.executable.file", "arg1" , "arg2" , "arg3" , ...) ;
어떤 프로세스의 엔트리 포인트에 전달됩니다 :
INT 주 (문자 * 인자를 확인 [
당신은 간부 (3)에 의해 허용 인수 목록 사이의 직접적인 상관 관계를 볼 수 있습니다 ]) {...}
argv[0]
이 실행 파일 이름입니다
및 argv[1]
— argv[n-2]
개별 인수하고, argv[n-1]
이를 나타 내기 위해 NULL 포인터입니다 인수 목록의 끝.
개념적으로 간단하고 구현하기 쉽습니다.
CP/M은 그렇게하지 않았습니다 (제한된 메모리로 인해). 시작된 프로세스를 쉘에서 원시 명령 행의 주소로 전달하고 프로세스의 구문 분석을 그대로 둡니다.
DOS는 1982 년에 CP/M의 복제본으로 시작하여 원시 처리 명령 행의 주소도 처리했습니다.
Windows는 처음 시작한 이후로 해당 모델에서 벗어나지 않았습니다. 는 Win32 CreateProcess()
기능은
BOOL WINAPI CreateProcess(
__in_opt LPCTSTR lpApplicationName,
__inout_opt LPTSTR lpCommandLine,
...
);
여전히 프로그램에 전달되는 원시 명령 줄을 통과, 같은 일을한다. 물론 C 런타임 라이브러리는 커맨드 라인 파싱을 처리합니다.
CLR/.Net 세계에서 이러한 모든 역사 때문에 CLR은 Win32 API에 종속적으로 설계 되었기 때문에 시작할 명령에 완전한 명령 줄을 전달했습니다.왜 그들이 params string[]
을 전달하지 못하게하고 CLR이 명령 줄을 작성하게 만들지 않았습니까? Microsoft의 개발자들이 가슴 가까이에 보관 해 놓은 것입니다.
시작 프로그램에 필요한 명령 줄을 작성하는 것은 간단합니다. 각 인수를 인수를 분리하는 SP 문자가있는 단일 문자열로 결합하기 만하면됩니다. 쉬운!
... 인수 중 하나에 공백이나 큰 따옴표 ("
)가 포함될 때까지 ....
그런 다음 인수 중 하나 또는 모두를 인용해야합니다. 쉬운 일이지만, 기괴한 견적 규칙 때문에, 당신을 위로 여행 할 수있는 많은 가장자리 조건이 있습니다.
Windows 명령 줄은 공백으로 구분 된 단어로 나뉘며, 큰 따옴표 ("
)로 선택적으로 인용 할 수 있습니다. 부분적으로 Windows에서도 경로 구분 기호가 잘못 되었기 때문에 (/
이 아닌 \
) 인용 규칙은 ... byzantine입니다. Windows CRT 소스 코드 (이 파일은 (VisualStudioInstallLocation) \ VC \ crt \ src \ stdargv.c와 유사 함)를 파고 들면 명령 줄 해석 코드를 찾을 수 있습니다.
샘플 코드입니다. 의심의 여지가 없습니다. 그러나 실제로 그것을 사용하지 마십시오. Directory.GetFiles() 메소드는 * lot * 적은 오버 헤드로 동일한 작업을 수행합니다. –