2016-10-17 8 views
1

コマンドを実行できないときはいつでも、「バイナリを実行するとエラー:-nameOfBinary-」というシェルを作ろうとしています。しかし、それは常に私に "No such file or directory"というメッセージを与えるということです。 相続人の私のコードの一部:コード付きC - "No such file or directory"というメッセージを置き換えます。

void handle_SIGINT() { 
    write(STDOUT_FILENO,line,strlen(line)); 
    printf("\n"); 
    struct sigaction handler; 
    handler.sa_handler = handle_SIGINT; 
    sigaction(SIGINT, &handler, NULL); 
} 

void runcommand(char* argv[]) { 
    int p =fork(); 
    if(p==0) { 
    struct sigaction handler; 
    handler.sa_handler = SIG_IGN; 
    sigaction(SIGINT, &handler, NULL); 
    execvp(argv[0],argv); 
    perror("Error executing binary"); 
    exit(1); 
    } else { 
    wait(NULL); 
    } 

}

それは常にそれをある私にメッセージ「エラーバイナリ実行していない:そのようなファイルやディレクトリ」を与えるように私が望むものに近いです! どうすれば修正できますか? ありがとうございます!

答えて

1

機能perror()は、ユーザーが指定する文字列、コロンとスペースを印刷し、その後、errnoENOENTまたはあなたの場合は「いいえそのようなファイルまたはディレクトリ」)の現在の値と改行に対応する文字列を追加します。それがあなたが望むメッセージでないならば、独自のエラー報告機能を書いて呼び出す必要があります。

あなたはカンニングと簡単に使用することができます。あなたのような何か与える

perror(argv[0]); 

name-of-binary: No such file or directory 

またはあなたが書くことができますが、あなた自身:その後、

#include <errno.h> 
#include <stdarg.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void err_syserr(const char *fmt, ...) 
{ 
    int errnum = errno; 
    va_list args; 
    va_start(args, fmt); 
    vfprintf(stderr, fmt, args); 
    if (errnum != 0) 
     fprintf(stderr, "%d: %s\n", errnum, strerror(errnum)); 
    putc('\n', stderr); 
    exit(EXIT_FAILURE); 
} 

とそれを呼び出します:

err_syserr("Error executing binary: %s: ", argv[0]); 

この関数はexit()を呼び出しているため、返さないことを示す_Noreturnという装飾を付けて、呼び出しコードにexit(1);は必要ありません。

メッセージだけでなくエラー番号の印刷もバッドシング™だと主張している人はいますが、私がしている仕事の大部分について私は同意しません。 Web対応のコードでは問題になるかもしれませんが、Web対応のコードではありません。

+0

私は実際にそれを少し前に理解しました! –

+0

それは私が想像したよりも実際には簡単です。 execvp()関数は、実行に失敗したときに-1を返します。したがって、if(execvp(argv [0]、argv)== -1)printf( "バイナリを実行中のエラー:%s"、argv [0]); –

+0

'exec *()'関数から戻りコードをチェックする必要はありません。関数の 'exec *()'ファミリのいずれかが返ってきた場合は失敗したため、条件は必要ないのでエラーを報告してください。エラーメッセージは 'stdout'ではなく' stderr'に書き込まれることを覚えておいてください。これが標準エラーストリームです。 –

関連する問題