1

現在、コマンド ラインから .c ファイルを自動コンパイルするプロジェクトに取り組んでいます。そのために、次のコードを使用します。

bool auto_compile(process_t *p) {
    char* file_name = p->argv[0];
    char* compile_args[] = {"gcc", "-o", "devil", file_name, NULL};
    int status, pid;
    switch(pid = fork()) {
        case -1:
            logger("fork", 1);
            exit(EXIT_FAILURE);
        case 0:
            execvp("gcc", compile_args);    
        default:
            waitpid(pid, &status, WUNTRACED);
            if(WIFEXITED(status)) {
                if(status != EXIT_SUCCESS) {
                   logger("Error, could not compile", 4);
               return false;
                }
            }    
     }
     return true;
}

gcc に無効なパラメータ (無効なファイル名) を入力すると、gcc エラー メッセージが端末に出力されます。代わりにこのエラーをファイルにリダイレクトしたい場合、どうすればキャッチできますか?

4

1 に答える 1

0

ほとんどのプログラムと同様に、gcc は通常の出力 (スイッチを使用した場合など-E) をファイル記述子 1 に書き込み、エラー メッセージをファイル記述子 2 に書き込みます。 exec-ed プロセスは通常、開いているファイル記述子をその親から継承します。fd 1 と 2 をシェルの端末にしたくない場合は、dup2.

switch(pid = fork()) {
    /*...*/
    case 0: {
        int gccerr_fd = open("gcc_errors.txt", O_CREAT|O_WRONLY);
        if (gccerr_fd > 0) {
            dup2(gccerr_fd, 2);
            close(gccerr_fd);
        }
        execvp("gcc", compile_args);
    }

または、親プロセスまたは別の子プロセスで結果を読み取るだけの場合は、ファイルを -ing するpipe代わりにa を使用することを検討できます。open

于 2014-02-18T20:40:09.303 に答える