2017-11-24 21 views
0

execlが存在しないファイルを起動しようとしたときに返されたエラーを理解しようとしています。execlエラー==ファイルが存在しないときに "ファイルが存在する"

# include <stdio.h> 
# include <assert.h> 
# include <sys/types.h> 
# include <sys/wait.h> 
# include <unistd.h> 
# include <stdlib.h> 

int spawn1(char *, char *, char *); 

int main(){ 
    int i, t, tt, state; 

    for(i = 0; i < 10; i++){ 
    t = spawn1("functiondoesntexist", "strange name", "argument"); 
    if (t < 0){ 
     perror("fork"); // fork error 
     break; 
    } 
    tt = wait(&state); 
    assert(tt == t); 
    if (state != 0){ 
     perror("exec didn't work"); 
     break; 
    } 
    } 
    return i != 10; 
} 

int spawn1(char * file, char * command, char * arg){ 
    int t; 

    t = fork(); 
    if (t < 0)     // fork error 
    return -1; 

    if (t == 0){     // child 
    execl(file, command, arg, (void *)0); 
    exit(1); 

    } 
           // parent 
    return t; 
} 

エラーが返されます:

exec didn't work: File exists 

なぜISNここ

はメインフォークを作成し、EXECLを起動しようとする機能のspawn1を呼び出し、この実験のために私のコードです「ファイルは存在しない」のようなものがありますか?

答えて

4

あなたは正しい場所にperrorを呼び出していません。

機能が失敗した場合は、errnoをチェックするか、失敗した機能の後にperrorすぐにを呼び出してください。失敗した後に呼び出される他のシステム関数またはライブラリ関数は、それ自身のエラーコードでerrnoを上書きします。

あなたは次のようにすぐにperrorを呼び出すコードを変更:

int main(){ 
    int i, t, tt, state; 

    for(i = 0; i < 10; i++){ 
    t = spawn1("functiondoesntexist", "strange name", "argument"); 
    if (t < 0){ 
     fprintf(stderr, "fork failed\n"); // not perror 
     break; 
    } 
    tt = wait(&state); 
    assert(tt == t); 
    if (state != 0){ 
     fprintf(stderr, "exec didn't work\n"); // not perror 
     break; 
    } 
    } 
    return i != 10; 
} 

int spawn1(char * file, char * command, char * arg){ 
    int t; 

    t = fork(); 
    if (t < 0) {     // fork error 
    perror("fork failed");  // call perror here to check fork 
    return -1; 
    } 

    if (t == 0){     // child 
    execl(file, command, arg, (void *)0); 
    perror("exec failed");  // call perror here to check execl 
    exit(1); 

    } 
           // parent 
    return t; 
} 
関連する問題