| [ CnUnix ] in KIDS 글 쓴 이(By): heloise (오후의햇살) 날 짜 (Date): 2002년 3월 27일 수요일 오후 02시 52분 57초 제 목(Title): compiler-dependent argv treatment 윈도우 환경에서의 질문이긴 하지만, 여기다 올리는게 젤 빠를 것 같아서, 올립니다. 짧은 버전은 "윈도우에서 Microsoft C compiler를 써서 컴파일하는 프로그램에서 다른 프로세스를 불러야 하는데, 불러야 하는 프로세스의 execution path나 command line argument가 space를 가지고 있다면, 어떤 콜을 써서 부르는게 좋은가요?" 이구요, 긴 버전은 윈도우에서 프로그램을 짜면서, _spawnvp ()를 써서, 다른 프로세스를 생성하고 있는데요, _spawnvp()의 2nd argument가 file execution path이고, _spawnvp()의 3rd argument가 char **argv라서, 보통은 그냥 char **args를 argument vector로 만들어서 args[0]하고 args를 각각 2nd와 3rd argument로 넘기고 있었는데, args가 가리키는 스트링중에 space를 가진 게 있으면, argument vector를 제대로 넘겨주지 않더라구요. 예를 들어, args[0] = "example_dir\\example.exe"; args[1] = "argument space"; args[2] = NULL; _spawnvp (_P_WAIT, args[0], args); 이렇게 짜고, example.exe가 자기가 받은 argv를 print하도록 해보면, example.exe에서는 argv[0] = example_dir\example.exe argv[1] = argument argv[2] = space 뭐 이런 식으로 나옵니다. 그래서, 지금은 args[0] = "\"example dir\\example.exe\""; args[1] = "\"argument space\""; args[2] = NULL; execfile = "example dir\\example.exe"; _spawnvp (_P_WAIT, execfile, args); 이렇게 해야 제가 원하는 것처럼, example.exe가 argv[0] = example dir\example.exe argv[1] = argument space 이렇게 프린트해 줍니다. (물론 제가 부르려는 진짜 프로세스가 그냥 argv를 프린트해야하는 건 아니구요...) (그러니깐, argument에 space가 있으면, enclosing 하는 quotation을 넣어줘야 하고, 실행하고자하는 파일 execution path자체가 space를 가지고 있으면, args자체는 enclosing quotation을 넣어서 넘기면서도, _spawnvp()의 2nd argument는 그런 quotation없이 넘겨야 제대로 실행됩니다.) 이상은 모두 Microsoft compiler를 사용했을 경우이고, gcc를 쓰면, 이런 문제 없습니다. 근데, gcc를 사용할 수 없는 상황입니다. 생각하기에, space가 있는 디렉토리 이름은 정말 많이 쓰는 거고, 그러면, file execution path나 command line argument가 space를 가지는 일도 정말 많을 텐데, 이런 식의 adhoc한 방법을 쓸 것 같지는 않거든요. 보통 process생성할 때, 어떤 방법을 쓰는 건가요? 윈도우 환경을 잘 몰라서, 혼자 삽질 하고 있는 듯 합니다. |