C - 替换 "No such file or directory" 消息

C - Replace "No such file or directory" message

我正在尝试制作一个 shell,当它无法执行命令时,它会显示 "Error executing binary: -nameOfBinary-"。但问题是它总是给我消息 "No such file or directory"。 这是我的部分代码:

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

}

使用代码,它总是给我消息 "Error executing binary: No such file or directory",这接近我想要的! 我该如何解决? 提前致谢!

函数perror()打印你提供的字符串,一个冒号和一个space,然后加上errno当前值对应的字符串(ENOENT或 'No such file or directory' 在你的情况下)和换行符。如果那不是您想要的消息,您必须编写并调用您自己的错误报告函数。

你可以作弊并简单地使用:

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修饰,表示它没有return,你不需要exit(1);调用代码。

有些人认为打印错误编号和消息是一件坏事™,但(如您所猜)我不同意我所做的大部分工作。这在面向网络的代码中可能很重要,但这不太可能是面向网络的代码。