2016-10-17 6 views
1

명령을 실행할 수 없을 때마다 "이진 실행 오류 : -nameOfBinary-"라는 셸을 만들려고합니다. 그러나 그 문제는 항상 "No such file or directory"라는 메시지를 나에게줍니다. 을 Heres의 내 코드의 일부 : 코드와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() 인쇄 사용자가 제공 문자열, 콜론과 공간 기능 다음은 errno의 현재 값 (ENOENT 또는 귀하의 경우 '해당 파일이나 디렉토리')와 줄 바꿈에 해당하는 문자열을 추가합니다. 이것이 원하는 메시지가 아니라면, 자체 오류보고 기능을 작성하고 호출해야합니다.

당신은 속임수 간단하게 사용할 수 있습니다 : 당신 같은 줄 것이다

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);이 필요하지 않습니다.

메시지뿐만 아니라 오류 번호도 인쇄하는 것은 나쁜 생각이라고 주장하지만 (내가 생각한 것처럼) 나는 대부분의 작업에 동의하지 않습니다. 웹 지향 코드에서 중요 할 수 있지만 웹 지향 코드는 아닙니다.

+0

나는 그것을 실제로 얼마 전에 알아 냈다! –

+0

그것은 실제로 상상했던 것보다 더 간단합니다. execvp() 함수는 실행에 실패 할 때마다 -1을 반환한다는 것을 알게되었습니다. 그래서 나는 조건을 넣는다. (execvp (argv [0], argv) == - 1) printf ("이진 실행 오류 : % s", argv [0]); –

+0

리턴 코드 형태를'exec *()'함수로 확인할 필요가 없습니다. 함수의'exec *()'패밀리 중 하나가 반환되면 실패한 것이므로 조건이 필요하지 않습니다. 단순히 오류를보고하십시오. 에러 메시지는'stdout'이 아니라'stderr'에 쓰여진다는 것을 기억하십시오. 이것이 바로 표준 에러 스트림입니다. –