C - 替换“无此类文件或目录”消息

时间:2016-10-17 00:36:09

标签: c message execvp sigint sigaction

我正在尝试创建一个shell,无论何时无法执行命令,它都会显示“执行二进制文件时出错:-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);
  }

}

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

1 个答案:

答案 0 :(得分: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™但是(你可以猜到)我不同意我做的大部分工作。它可能在面向网络的代码中很重要,但这不可能是面向网络的代码。