我正在尝试创建一个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);
}
}
使用代码,它总是给我一条消息“执行二进制文件时出错:没有这样的文件或目录”,它接近我想要的! 我该如何解决? 提前谢谢!
答案 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™但是(你可以猜到)我不同意我做的大部分工作。它可能在面向网络的代码中很重要,但这不可能是面向网络的代码。