0

これに似た質問があるかもしれないことは知っていますが、それらは 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 でコンパイルされています。何らかの理由で、system();GCC コンパイル アクションを実行する必要がある関数がcdコマンドの前に実行され、次の出力が得られます。

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

しかし、cdステートメント (実行される順序を確認するために印刷したもの) の後、GCC コンパイル コマンドが実行されず、コンパイルされていない App.c が残り、プログラムの実行時にエラーが発生します。なぜこれが起こっているのかについての助けをいただければ幸いです。

4

2 に答える 2

7

2 つの「問題」があります。

  • 表示されている出力は、stderr(GCC エラー メッセージ) とstdout(残りの部分) の両方からのものです。これらのメッセージが端末に表示される順序は、それらを生成したコードが実行された順序と同じであると推測しています-それを信頼することはできません. stdout通常はバッファリングされますが、通常はバッファリングされstderrないため、画面に表示される順序はコードの実行順序の指標ではありません。
  • system("cd whatever");呼び出しはバグです。新しいシェルが生成され、そのシェルがディレクトリを変更して...すぐに存在します。system親プロセスまたは後続の呼び出しに副作用はありません。chdir親プロセスで使用するか、同じ呼び出しでcdandを実行する必要があります。gccsystem
于 2012-04-14T08:43:46.720 に答える
2

systemコマンドは、個別のプロセスとして実行されます。新しいプロセスの動作を変更すると、すぐに終了します..次に実行されるプロセスには影響しません。

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

于 2012-04-14T08:43:45.297 に答える