【发布时间】:2022-01-17 13:01:31
【问题描述】:
我正在尝试包装一个可变参数函数来预先验证输入。准确地说,我需要调用 sd_notifyf(int unset_environment, const char *format, ...)。
https://www.freedesktop.org/software/systemd/man/sd_notify.html
但在调用 sd_notifyf 之前,我想验证格式的输入,然后在包装函数中调用 sd_notify()。
目前我尝试了以下方法:
void wrapperFunc(int unset_environment, const char *format, ...) {
va_list list;
va_start(list, format);
//validation of va_args
sd_notifyf(unset_environment, format, list);
va_end(list);
}
int main(int argc, char *argv[]) {
wrapperFunc(0, "STATUS=args: '%s' : '%s'", "arg1", "arg2");
}
在实际代码中,启动服务时会调用wrapperFunc(),所以你可以理解我为什么要调用sd_notifyf()。
在我当前的实现中,检查服务状态时会返回以下内容: STATUS=args: '^P' : 'arg2'
为什么它只正确显示第二个参数?以及如何正确包装 sd_notifyf() ?
【问题讨论】:
-
Sooo,你听说过
snprintf吗?还是更好的aprintf?vsnprintf和vasprintf?然后拨打sd_notify -
当你说“为什么它只正确显示第二个参数?”你实际上得到了什么?
-
@KamilCuk 不是真的,这是我第一次使用可变参数函数,所以我还在学习。您能否提供一个小例子,我如何使用 vsnprintf 实现这一目标?
-
@Andrew 我在帖子中包含的输出,第一个参数总是减少到 '^P' 而第二个是正确的,不知道如何调试 sd_notifyf 的输出所以我不知道为什么我收到第一个 arg 的 '^P'
标签: c variadic-functions systemd variadic