我知道可能存在与此类似的问题,它只是在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编译。出于某种原因,应该执行GCC编译操作的system();
函数在cd
命令之前执行,给出了这个输出:
gcc: App.c: No such file or directory
gcc: no input files
Building application...
cd ./Projects/Sample
但是,在cd
语句(我打印它以检查它们执行的顺序)之后,GCC编译命令没有执行,留下我一个未编译的App.c,以及程序错误执行。
任何帮助,为什么会发生这种情况将不胜感激。
答案 0 :(得分:7)
你有两个“问题”:
stderr
(GCC错误消息)和stdout
(其余部分)。您推断这些消息在终端上显示的顺序与生成它们的代码的顺序相同 - 您不能依赖它。 stdout
通常是缓冲的,而stderr
通常不是,因此它们在屏幕上显示的顺序并不代表您的代码执行顺序。system("cd whatever");
来电是一个错误。它产生一个新的shell,shell更改目录并且......立即存在。它对父进程或后续system
调用没有任何副作用。您需要在父进程中使用chdir
,或在同一cd
来电中执行gcc
和system
。答案 1 :(得分:2)
每个system
命令作为单独的进程执行。你改变刚刚结束的新进程的工作。它对下一个执行的进程没有影响。
使用system("cd dir; command");