nmap中将vfprintf用于日志记录
void nsock_trace(mspool *ms, char *fmt, ...) {
va_list ap;
int elapsed_time_ms;
assert(ms->tracefile != NULL);
elapsed_time_ms = TIMEVAL_MSEC_SUBTRACT(nsock_tod, ms->tracebasetime);
va_start(ap, fmt);
fflush(ms->tracefile);
fprintf(ms->tracefile, "NSOCK (%.4fs) ", elapsed_time_ms / 1000.0);
vfprintf(ms->tracefile, fmt, ap);
fprintf(ms->tracefile, "\n");
va_end(ap);
}
自己写一个简单的日志记录程序
#include <stdio.h>
#include <stdarg.h>
#include <time.h>
void trace(FILE *ms, char *fmt,...)
{
time_t now;
struct tm*pst_time;
va_list ap;
time(&now);
pst_time=localtime(&now);
fprintf(ms,"time is %d - %d -%d",pst_time->tm_year+1900,
pst_time->tm_mon+1,pst_time->tm_mday);
va_start(ap,fmt);
vfprintf(ms,fmt,ap);
va_end(ap);
}
int main(int argc, char *argv[])
{
FILE *fs = fopen("cat.txt","a+");
trace(fs,"the job is %s %d\n","preseeding",10);
return 0;
}
打开文件cat.txt查看输出结果如下:
time is 2018 - 4 -25the job is preseeding 10
使用过程中定式:
valist ap;
va_start(ap,fmt);
va_end(ap);
在编译过程中出现的问题:段错误,之后利用gdb定位到,是vfprintf函数format参数中占位符和后面的参数表中参数类型不匹配造成的,更正之后编译运行成功。