CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ 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생성할 때, 어떤 방법을 쓰는 건가요?
윈도우 환경을 잘 몰라서, 혼자 삽질 하고 있는 듯 합니다.


[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.