<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>커맨드라인 GetCmdLine - Naver Ending Study</title>
	<atom:link href="https://nangchang.nes.or.kr/tag/%ec%bb%a4%eb%a7%a8%eb%93%9c%eb%9d%bc%ec%9d%b8-getcmdline/feed/" rel="self" type="application/rss+xml" />
	<link>https://nangchang.nes.or.kr</link>
	<description></description>
	<lastBuildDate>Tue, 21 Apr 2009 01:07:16 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8</generator>
	<item>
		<title>윈도우 커맨드 라인의 비밀(?)</title>
		<link>https://nangchang.nes.or.kr/%ec%9c%88%eb%8f%84%ec%9a%b0-%ec%bb%a4%eb%a7%a8%eb%93%9c-%eb%9d%bc%ec%9d%b8%ec%9d%98-%eb%b9%84%eb%b0%80/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25ec%259c%2588%25eb%258f%2584%25ec%259a%25b0-%25ec%25bb%25a4%25eb%25a7%25a8%25eb%2593%259c-%25eb%259d%25bc%25ec%259d%25b8%25ec%259d%2598-%25eb%25b9%2584%25eb%25b0%2580</link>
					<comments>https://nangchang.nes.or.kr/%ec%9c%88%eb%8f%84%ec%9a%b0-%ec%bb%a4%eb%a7%a8%eb%93%9c-%eb%9d%bc%ec%9d%b8%ec%9d%98-%eb%b9%84%eb%b0%80/#respond</comments>
		
		<dc:creator><![CDATA[낭창]]></dc:creator>
		<pubDate>Tue, 21 Apr 2009 01:07:16 +0000</pubDate>
				<category><![CDATA[프로그래밍 이야기]]></category>
		<category><![CDATA[커맨드라인 GetCmdLine]]></category>
		<guid isPermaLink="false">http://nangchang.nes.or.kr/?p=420</guid>

					<description><![CDATA[<p>비밀이라니까 좀 거창하지만&#8230; 윈도우 커맨드라인 때문에 겪었던 에피소드&#8230; == 자바 프로그램(A)에서 다른 프로그램(B)을 새로운 프로세스로 실행해야되는 상황이었는데, 원래는 잘 되다가 B의 버전이 바뀐 후 부터 실행 하자 마자 프로그램이 죽어버렸다. 그런데 신기한건, 윈도우의 [시작]-&#62;[실행]에서 실행하면 아무 문제 없이 잘 되고, cmd.exe 를 실행해서 커맨드 창에서 똑같이 실행하면 A에서 실행할 때와 똑같이 죽는다는 거다. 그리고 또 [&#8230;]</p>
<p>The post <a href="https://nangchang.nes.or.kr/%ec%9c%88%eb%8f%84%ec%9a%b0-%ec%bb%a4%eb%a7%a8%eb%93%9c-%eb%9d%bc%ec%9d%b8%ec%9d%98-%eb%b9%84%eb%b0%80/">윈도우 커맨드 라인의 비밀(?)</a> first appeared on <a href="https://nangchang.nes.or.kr">Naver Ending Study</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>비밀이라니까 좀 거창하지만&#8230; 윈도우 커맨드라인 때문에 겪었던 에피소드&#8230;</p>
<p>==</p>
<p>자바 프로그램(A)에서 다른 프로그램(B)을 새로운 프로세스로 실행해야되는 상황이었는데,</p>
<p>원래는 잘 되다가 B의 버전이 바뀐 후 부터 실행 하자 마자 프로그램이 죽어버렸다.</p>
<p>그런데 신기한건, 윈도우의 [시작]-&gt;[실행]에서 실행하면 아무 문제 없이 잘 되고,</p>
<p>cmd.exe 를 실행해서 커맨드 창에서 똑같이 실행하면 A에서 실행할 때와 </p>
<p>똑같이 죽는다는 거다.</p>
<p>그리고 또 하나, cmd.exe에는 start 라는 내장 명령이 있는데, (자세한건 나도 모르겠다)</p>
<p>이놈을 이용한 경우에도 실행이잘된다. B를 실행할때 커맨드 라인을</p>
<div style="margin-left: 2em;">c:\program\b.exe arg1 arg2 arg3 arg4 arg5</div>
<p>라고 준다고 했을 때,</p>
<div style="margin-left: 2em;">c:\&gt; c:\program\b.exe arg1 arg2 arg3 arg4 arg5</div>
<p>와 같이 실행하면 죽는데,</p>
<div style="margin-left: 2em;">c:\&gt; start &#8220;&#8221; c:\program\b.exe arg1 arg2 arg3 arg4 arg5</div>
<p>와 같이 실행하면 죽지 않는다.</p>
<p>B가 잘못된건 확실한 거 같은데&#8230; B의 소스가 없어서 확인할 방법은 없고&#8230;</p>
<p>좀 난감한 상황이었다.</p>
<p>start를 써 보려고 했으나 start는 cmd.exe의 내장 명령인지라&nbsp;새로운 프로세스를 실행하는</p>
<p>매소드에서는 먹히지 않는다.</p>
<p>아무리 생각해도 달라질 수 있는 건, 환경변수와 작업 디렉토리.</p>
<p>그런데 시작 디렉토리를 변경해 봐도 딱히 변화가 없었고, 환경변수도 문제가 될거 같진 않았다.</p>
<p>그래서 우선은 파이썬으로 간단한 프로그램을 짜서 확인해 봤다.</p>
<ol style="margin-left: 2em;" class="code">
<li>import os, sys
<p>print os.getcwd()<br />print os.environ</p>
<p>raw_input(&#8220;press any key&#8230;&#8221;)</li>
</ol>
<p>우선, cmd.exe에서 실행 했을때는 start 명령을 사용 여부에 관계없이</p>
<p> 작업 디렉토리와 환경변수는 동일했다.</p>
<p>그리고, [시작]-&gt;[실행]에서 실행한 경우,</p>
<p>작업 디렉토리는 프로그램이 있는 경로로 변경되었고,</p>
<p>환경변수는 PATH 등이 미묘하게 달랐으나, 별 문제 될건 없을 거 같았다.</p>
<p>점점 문제가 미궁으로 빠질 무렵, 다른 사람을 통해 새로운 힌트를 얻었다.</p>
<p>커맨드 라인의 모든 아규먼트를 &#8221; 로 묶어서 하나의 아규먼트로 만들어서 넘긴 경우,</p>
<p>실행 양상이 좀 달라진다는 것.</p>
<p>원래대로라면 실행이 안되는게 맞겠지만 일단 실행은 되고 마지막 단계에 가서 죽어버렸다.</p>
<p>여기서 알아낸 사실은 B가 커맨드 라인 스트링을 통째로 받아서 처리를 한다는 것이었다.</p>
<p>보통은 argc, argv[] 와 같은 것들을 사용해서 각 커맨드 라인 아규먼트별로 분리된 채로</p>
<p>받아 처리하는데, 이 경우라면, 위와 같은 현상이 나타나진 않을 거라는 판단이었다.</p>
<p>그래서 찾아보니 win32 API에 GetCommandLine()라는 함수가 있었다.</p>
<p>이 함수는 커맨드 라인 스트링을 통째로 반환하는 함수였다.</p>
<p>그래. 분명 이 함수를 써서 커맨드 라인 문자열을 받은 다음에 tokenizer 등을</p>
<p>사용해서 나눠서 썼고, 그 과정에서 토큰이 잘못 나눠져서 문제가 발생한 것일 거야.</p>
<p>그래서 바로 커맨드 라인 스트링을 확인하는 작업에 착수했다.</p>
<p>간단하게 win32 프로그램을 작성했다.</p>
<ol style="margin-left: 2em;" class="code">
<li>#include &#8220;stdafx.h&#8221;<br />#include &lt;windows.h&gt;
<p>int _tmain(int argc, _TCHAR* argv[])<br />{<br />&nbsp;&nbsp;&nbsp; LPTSTR cmd = GetCommandLine();<br />&nbsp;&nbsp;&nbsp; printf( &#8220;cmd : [%s]\n&#8221;, cmd );<br />&nbsp;&nbsp;&nbsp; while (1) {<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return 0;<br />}</li>
</ol>
<p>(분명 입력을 받는 함수였던가.. 잠시 멈추는 함수가 하나 있었는데</p>
<p>너무 오래된지라 기억이 잘 안나서&#8230; 걍 무한 루프를 돌려 버렸다.-_-)</p>
<p>그런 다음 테스트를 해 봤다.</p>
<div style="margin-left: 2em;">c:\program\cmdtest.exe arg1 arg2 arg3</div>
<p>커맨드 라인에서 바로 실행 했을 때는&#8230;</p>
<div style="margin-left: 2em;">cmd : [c:\program\cmdtest.exe arg1 arg2 arg3]</div>
<p>와 같이 그대로 찍혔다.</p>
<p>start 명령을 사용한 경우에는,</p>
<div style="margin-left: 2em;">cmd : [c:\program\cmdtest.exe&nbsp; arg1 arg2 arg3]</div>
<p>첫 번째와 두 번째 아규먼트, 즉, cmdtest.exe와 arg1 사이에 스페이스가 하나 더 있었다.</p>
<p>마지막으로, [시작]-&gt;[실행]의 경우,</p>
<div style="margin-left: 2em;">cmd : [&#8220;c:\program\cmdtest.exe&#8221; arg1 arg2 arg3]</div>
<p>첫 번째 아규먼트인 프로그램명에 &#8220;가 쳐졌다.</p>
<p>오호라&#8230; 그래서 즉시 A에서 B를 실행하는 부분에 프로그램 경로를 줄때 &#8220;로 감싸도록 수정했다.</p>
<p>결과는 성공! 역시나 커맨드 라인 문자열 처리가 문제였던것.</p>
<p>==</p>
<p>아직까지 어떤식으로 커맨드라인을 처리한 건지는 알 수가 없지만&#8230;</p>
<p>잘못 만든 프로그램 하나가 사람 여럿 고생 시킨다는 것이 오늘의 교훈&#8230;-_-;</p><p>The post <a href="https://nangchang.nes.or.kr/%ec%9c%88%eb%8f%84%ec%9a%b0-%ec%bb%a4%eb%a7%a8%eb%93%9c-%eb%9d%bc%ec%9d%b8%ec%9d%98-%eb%b9%84%eb%b0%80/">윈도우 커맨드 라인의 비밀(?)</a> first appeared on <a href="https://nangchang.nes.or.kr">Naver Ending Study</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://nangchang.nes.or.kr/%ec%9c%88%eb%8f%84%ec%9a%b0-%ec%bb%a4%eb%a7%a8%eb%93%9c-%eb%9d%bc%ec%9d%b8%ec%9d%98-%eb%b9%84%eb%b0%80/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
