除了其他答案之外,您可以在
stderr
上使用
fprintf(3)和
errno(3)与
strerror(3)一起使用。
fprintf(stderr, "something wrong: %s\n", strerror(errno));
在GNU libc系统(许多Linux系统)上,您可以使用
%m
转换说明符代替:
fprintf(stderr, "something wrong: %m\n");
您应该将错误消息输出到
stderr
(参见
stderr(3));使用系统日志,可以参考
syslog(3)。
不要忘记在格式字符串末尾加上
\n
,因为
stderr
通常是行缓冲的(但有时不是),或者使用
fflush(3)。
例如,您可能希望在
fopen
失败时显示错误、文件名和当前目录:
char* filename = somefilepath();
assert (filename != NULL);
FILE* f = fopen(filename, "r");
if (!f) {
int e = errno;
if (filename[0] == '/')
fprintf(stderr, "failed to open %s : %s\n", filename, strerror(e));
else {
char dirbuf[128];
memset (dirbuf, 0, sizeof(dirbuf));
if (getcwd(dirbuf, sizeof(dirbuf)-1))
fprintf(stderr, "failed to open %s in %s : %s\n",
filename, dirbuf, sterror(e));
else
fprintf(stderr, "failed to open %s here : %s\n",
filename, sterror(e));
};
exit(EXIT_FAILURE);
}
记住,
errno
可能会被许多故障覆盖(因此我们将其存储在
e
中,在
getcwd
失败并覆盖
errno
的不太可能的情况下)。
如果您的程序是守护进程(例如已调用
daemon(3)),则最好使用系统日志(即在调用
daemon
之后调用
openlog(3)),因为
daemon
可以将
stderr重定向到
/dev/null
。