2012-04-14 4 views
0

나는 이것들과 비슷한 질문을 할 수 있음을 알고있다. 그것들은 C++에 있고 그것들이 같은지 나는 모른다. 일부 코드가 있습니다C 순서대로 실행되지 않는 함수들

void BuildApp(char *AppName) 
{ 
     char *cmd; 
     cmd = combine("mkdir ./Projects/", AppName); 
     cmd = combine(cmd, "/Package/"); 
     // Make the package dir. 
     system(cmd); 
     cmd = ""; 
     cmd = combine("mkdir ./Projects/", AppName); 
     cmd = combine(cmd, "/Package/DEBIAN"); 
     system(cmd); 
     cmd = ""; 
     cmd = combine("mkdir ./Projects/", AppName); 
     cmd = combine(cmd, "/Package/Applications"); 
     system(cmd); 
     cmd = ""; 
     cmd = combine("mkdir ./Projects/", AppName); 
     cmd = combine(cmd, "/Package/Applications/"); 
     cmd = combine(cmd, AppName); 
     cmd = combine(cmd, ".app"); 
     system(cmd); 
     cmd = ""; 
     cmd = combine("mkdir ./Projects/", AppName); 
     cmd = combine(cmd, "/Package/Applications/"); 
     cmd = combine(cmd, AppName); 
     cmd = combine(cmd, ".app/Inc"); 
     system(cmd); 
     cmd = ""; 
     cmd = combine("cp ./Projects/", AppName); 
     cmd = combine(cmd, "/Assets/app.icon.png ./Projects/"); 
     cmd = combine(cmd, AppName); 
     cmd = combine(cmd, "/Package/Applications/"); 
     cmd = combine(cmd, AppName); 
     cmd = combine(cmd, ".app/Icon.png"); 
     system(cmd); 
     printf("Building application..."); 
     cmd = ""; 
     cmd = combine("cd ./Projects/", AppName); 
     system(cmd); 
     printf(cmd); 
     cmd = ""; 
     cmd = combine("gcc App.c -o ", AppName); 
     printf(cmd);system(cmd); 
     system(cmd); 
} 

하지만 순서가 잘못된 것으로 보입니다. 이것은 Linux (실제로는 cygwin)에서 실행 중이며 GCC로 컴파일됩니다. 나는 그들이 어디 순서를 확인하기 위해 인쇄하는합니다 (cd 문 다음에,

gcc: App.c: No such file or directory 
gcc: no input files 
Building application... 
cd ./Projects/Sample 

그러나 : 어떤 이유로 들어, GCC 조치를 컴파일 실행해야 system(); 함수는 cd 명령 앞에 실행 나에게이 출력을주고있다 GCC 컴파일 명령이 실행되지 않아 컴파일되지 않은 App.c 및 프로그램 실행시 오류가 발생합니다. 왜 이런 일이 일어나는지에 대한 도움을 주시면 감사하겠습니다.

+0

전체 소스 코드를 게시 할 수 있습니까? (또는 문제를 재현하기에 충분합니까?) – Edmund

+0

system() 시스템 콜백에서 세미콜론을 사용하지 않는 이유는 무엇입니까? "mkdir .../...; cd ...; gcc ..."와 비슷합니다. –

+0

내 주요 응용 프로그램 파일에서 명령 행 인자가 있는지 확인하고'BuildApp(); 'argv [1]'을 char 파라미터로 사용한다. 다음은'combine();'함수 코드입니다 :'char buffer [100]; char * combine (char * str1, char * str2) { sprintf (버퍼, "% s % s", str1, str2); 리턴 버퍼; }' – Matthew

답변

7

당신이 "문제"가 :

  • 당신이보고있는 출력은 모두 stderr (GCC의 오류 메시지) 및 stdout (그것의 나머지)에서이다. 이 메시지가 터미널에 나타나는 순서가 해당 메시지를 생성 한 코드의 순서와 같다고 추측 할 수 있습니다. 그 메시지에 의존 할 수는 없습니다. 일반적으로 stderr은 버퍼되지 않으며 화면에 표시되는 순서는 코드 실행 순서의 표시가 아닙니다.
  • system("cd whatever"); 호출은 버그입니다. 그것은 새 쉘을 생성하고, 쉘은 디렉토리를 변경하고 ... 즉시 존재합니다. 부모 프로세스 나 이후의 system 호출에는 부작용이 없습니다. 상위 프로세스에서 chdir을 사용하거나 동일한 system 호출에서 cdgcc을 수행해야합니다.
2

system 명령은 별도의 프로세스로 실행됩니다. 당신은 새로운 프로세스의 작업을 변경합니다. 다음 프로세스는 다음 프로세스에 영향을 미치지 않습니다.

사용 system("cd dir; command");

관련 문제