2014-10-18 69 views
1

我有下面的代碼可以讓一個孩子分叉並執行命令「a」,這是一個未知的命令。但是,execvp不返回錯誤,而是打印「成功」。如果我做「mv b」,當文件「a」不存在時,會發生同樣的事情。我應該如何捕獲並處理這些錯誤?Execvp不會在未知命令上返回錯誤

int main (int argc, char **argv){ 
    pid_t pid; 
    char *execArgs[] = { "a", NULL }; 

    pid = fork(); 

    // if fork fails 
    if (pid < 0){ 
    exit(EXIT_FAILURE); 
    } 
    else if (pid == 0){ 
    execvp(execArgs[0], execArgs); 
    if (errno == ENOENT) 
     _exit(-1); 
    _exit(-2); 
    } 
    else{ 
    int status; 
    wait(&status); 
    if(!WIFEXITED(status)){ 
     printf("error\n"); 
    } 
    else{ 
     printf("success\n"); 
    } 
    } 

} 
+0

請不要從你的問題刪除代碼 - 這是問題的一個重要組成部分,除去使它更難理解的答案(S)。 – 2014-10-20 16:13:31

回答

2

程序退出;它只是以非零狀態退出。 WIFEXITED的主要反義詞是WIFSIGNALED —對於其他選項,請參閱POSIX規範wait()WIFSTOPPEDWIFCONTINUED

用途:

int corpse = wait(&status); 
if (corpse != -1 && WIFEXITED(status)) 
{ 
    int estat = WEXITSTATUS(status); 
    char *err = (estat == 0) ? "success" : "failure"; 
    printf("PID %d exited with status %d (%s)\n", corpse, estat, err); 
} 
else 
    printf("PID %d didn't exit; it was signalled\n", corpse);