【问题标题】:C - Replace "No such file or directory" messageC - 替换“没有这样的文件或目录”消息
【发布时间】:2016-10-17 00:36:08
【问题描述】:

我正在尝试制作一个外壳,当它无法执行命令时,它会显示“执行二进制文件时出错:-nameOfBinary-”。但问题是它总是给我“没有这样的文件或目录”的消息。 这是我的部分代码:

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

}

使用代码,它总是给我消息“执行二进制文件时出错:没有这样的文件或目录”,这与我想要的很接近! 我该如何解决? 提前致谢!

【问题讨论】:

    标签: c message execvp sigint sigaction


    【解决方案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 的代码。

    【讨论】:

    • 其实我早就想通了!
    • 它实际上比我想象的要简单得多。我意识到函数 execvp() 在执行失败时返回 -1。所以我只是把条件 if(execvp(argv[0], argv) ==-1) printf("Error execution binary: %s", argv[0]);
    • 您永远不需要检查 exec*() 函数的返回码。如果exec*() 系列函数中的任何一个返回,那是因为它失败了,所以条件不是必需的——只需报告错误即可。请记住,错误消息被写入stderr,而不是stdout——这就是为什么它是标准错误流。
    猜你喜欢
    • 2014-06-25
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多