【问题标题】:Execvp doesn't return an error on an unknown commandExecvp 不会在未知命令上返回错误
【发布时间】:2014-10-21 00:12:37
【问题描述】:

我有以下代码分叉一个孩子并执行命令“a”,这是一个未知命令。但是, execvp 不返回错误,而是打印“成功”。如果我执行“mv a b”,当文件“a”不存在时,也会发生同样的事情。我应该如何捕捉和处理这些错误?

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

}

【问题讨论】:

  • 请不要从您的问题中删除代码 - 这是问题的关键部分,删除会使答案更难理解。

标签: c exec


【解决方案1】:

程序退出;它只是以非零状态退出。 WIFEXITED 的主要对立面是 WIFSIGNALED — 有关其他选项,请参阅 wait()WIFSTOPPEDWIFCONTINUED 的 POSIX 规范。

用途:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-11
    • 2013-01-14
    • 2017-02-04
    • 2011-05-04
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    相关资源
    最近更新 更多