#if 1
static int nand_log(const char *format, ...){
static char logbuf[8192];
static int offset = 0;
static FILE *fp = NULL;
va_list args;
int len;
if(fp == NULL){
fp = fopen("/home/host_name/femu_log/femu.log", "w+");
assert(fp != NULL);
if(fp == NULL){
fprintf(stderr, "fopen doesn't work\n");
}
fprintf(stdout, "%p\n", fp);
}
va_start(args, format);
len = vsprintf(logbuf + offset, format, args);
va_end(args);
offset += len;
if(offset >= 4096){
fwrite(logbuf, strlen(logbuf), 1, fp);
offset = 0;
fflush(fp);
}
return len;
}
#endif
위 코드는 file에 log message를 기록하는 함수이다. 가변 인자를 받아서 log message를 작성하고, 내부 buffer에 저장한 후 일정 크기 이상이 되면 file에 기록한다.
이 코드에 대해서 간단히 설명하자면,
먼저 static 함수로 설정해서 여러 file에서 이름이 겹치는 일이 없게 설정을 해두었다. 다른 file에서도 쓰고 싶으면 static 키워드를 없애면된다.
'static char logbuf[8192]':
'static int offset = 0':
'va_list args':
'int len':
'va_start(args, format)':
'len = vsprintf(logbuf + offset, format, args)':
'va_end(args)':
offset += len 을 통해 다음 로그 메시지가 기록될 위치를 업데이트하고, log message의 길이가 총 4096 바이트 이상되면 버퍼에 있는 내용을 파일에 기록한다. 그후, offset을 초기화해서 buffer의 처음부터 기록할 수 있게 한다.
fflush(fp)는 file pointer fp와 관련된 출력 버퍼를 비운다. 이를 통해 파일에 즉시 기록된다.