1

我正在尝试制作一个外壳,当它无法执行命令时,它会显示“执行二进制文件时出错:-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);
  }

}

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

4

1 回答 1

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 的代码。

于 2016-10-17T02:14:17.060 回答