2014-10-18 48 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);