我正在尝试包装一个可变函数来预先验证输入。准确地说,我需要调用sd_notifyf(int unset_environment,const char*format,…(
https://www.freedesktop.org/software/systemd/man/sd_notify.html
但在调用sd_notifyf之前,我想验证格式的输入,然后在包装函数中调用sd_nodify((。
目前我已经尝试了以下几种:
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=参数:"^P":"arg2">
为什么它只正确地显示了第二个论点?如何正确地包装sd_notifyf((?
代码的行为是未定义的。
sd_notifyf
是变差函数,而不是以va_list
作为最后参数的函数
int sd_notifyf( int unset_environment,
const char *format,
…);
恐怕您无法编写包装器函数,因为没有采用va_list
的sd_notify
函数版本
只能使用宏定义。
#define wrapperMacro(unset_environment, format, ...)
do{
/* do some stuff */
sd_notifyf(unset_environment, format, __VA_ARGS__);
}while(0)
您也可以使用字符串printf
函数(在本例中为vsnprintf
(:
#define LARGE_ENOUGH_TO_ACCOMODATE_THE_STRING 64
void wrapperFunc(int unset_environment, const char *format, ...) {
va_list list;
va_start(list, format);
char buff[LARGE_ENOUGH_TO_ACCOMODATE_THE_STRING];
vsnprintf(buff, sizeof(buff), format, list);
sd_notify(unset_environment, buff);
va_end(list);
}