【发布时间】:2017-12-14 11:41:04
【问题描述】:
我目前正在尝试为作为守护进程运行的程序定义日志宏。
因为它是一个守护进程,所以我将 stdout 和 stderr 都重定向到一个特定的文件。这一步没问题,我有两个用于记录的宏,它们写在同一个文件中。
define LOG(fmt, args...) fprintf(stdout, fmt, ## args); \
fflush(stdout)
#define LOG_ERR(fmt, args...) fprintf(stderr, fmt, ## args);
我的意思是我想要一个“类似错误”的跟踪:
<Message with arguments> : <errno associated message>
所以我搜索了一下,如果我将 LOG_ERR 修改为:
#define LOG_ERR(fmt, args...) fprintf(stderr, fmt, ## args); \
perror("")
它可以工作,但 errno 相关消息是在 \n 字符之后发送的(我认为是因为 stderr 被缓冲了) 所以我得到:
<Message with arguments>
<errno associated message>
另一种解决方案可能是使用 strerror 函数作为最后一个参数,但我真的不知道是否可以这样做。 它看起来像:
#define LOG_ERR(fmt, args...) fprintf(stderr, fmt, ## args, strerror(errno));
但是这个解决方案也失败了,因为没有插入 errno 表示,甚至没有写入行尾字符。
有人知道我如何在不使用函数的情况下实现它吗?
【问题讨论】:
-
只是一个评论:一般来说,守护进程不应该使用stdout和stderr。也许 syslog() 或 vsyslog() 是更好的选择?
-
为什么功能不对?无论如何,您都调用 printf 。使函数内联,您将获得相同的性能。
-
fmt参数是否总是字符串文字?然后,您可以将字符串连接与#或仅与空格一起使用。例如。fmt ": %s\n" -
您可以使用
strerror(),但要遵守通常的注意事项(主要是确保在errno更改之前捕获正确的值)。另请参阅C#definemacro for debug printing。
标签: c linux error-handling macros