2016-10-17 65 views
1

我試圖做一個shell,只要它不能執行命令它說「執行二進制錯誤:-nameOfBinary-」。但問題是,它總是給我「沒有這樣的文件或目錄」的消息。我的代碼 繼承人部分:C - 替換「沒有這樣的文件或目錄」消息

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);

有些人認爲打印錯誤編號以及消息是A Bad Thing™,但是(正如你所猜測的),我並不同意我所做的大部分工作。這在面向Web的代碼中可能很重要,但這不可能是面向Web的代碼。

+0

我其實早就想通了! –

+0

它實際上比我想象的更簡單。我意識到execvp()函數在執行失敗時返回-1。所以我只是把條件if(execvp(argv [0],argv)== - 1)printf(「執行二進制錯誤:%s」,argv [0]); –

+0

你永遠不需要檢查一個'exec *()'函數的返回碼。如果任何'exec *()'函數系列返回,那是因爲它失敗了,所以條件不是必需的 - 只需報告錯誤。請記住,將錯誤消息寫入'stderr',而不是'stdout' - 這就是爲什麼它是標準錯誤流。 –

相關問題