C功能未按顺序执行

时间:2012-04-14 08:36:21

标签: c execution

我知道可能存在与此类似的问题,它只是在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,以及程序错误执行。  任何帮助,为什么会发生这种情况将不胜感激。

2 个答案:

答案 0 :(得分:7)

你有两个“问题”:

  • 您看到的输出来自stderr(GCC错误消息)和stdout(其余部分)。您推断这些消息在终端上显示的顺序与生成它们的代码的顺序相同 - 您不能依赖它。 stdout通常是缓冲的,而stderr通常不是,因此它们在屏幕上显示的顺序并不代表您的代码执行顺序。
  • system("cd whatever");来电是一个错误。它产生一个新的shell,shell更改目录并且......立即存在。它对父进程或后续system调用没有任何副作用。您需要在父进程中使用chdir,或在同一cd来电中执行gccsystem

答案 1 :(得分:2)

每个system命令作为单独的进程执行。你改变刚刚结束的新进程的工作。它对下一个执行的进程没有影响。

使用system("cd dir; command");