system 상에서 log를 찍을 때 사용했던 code

kyungminLim·2024년 8월 10일
0
#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]':

  • 'logbuf'는 log message를 저장하는 buffer이다. 크기는 8192 바이트고, log message를 여기에 일시적으로 저장하는 역할을 한다.
  • 'static'으로 선언해서, 함수 호출이 반복되더라도 버퍼가 초기화되지 않게 설정하였다.

'static int offset = 0':

  • 'offset'은 'logbuf' 내에서 현재 log message가 기록될 위치를 말한다.
  • 또한 'static'으로 선언해서, 함수 호출 간에 값 유지

'va_list args':

  • 'args'는 가변 인자 목록을 관리하기 위한 'va_list' 타입의 변수이다.
  • 'format'은 printf 계열 함수에서 사용되는 형식 문자열이며, 이후의 인자들이 이 형식에 맞게 출력된다.

'int len':

  • 'len'은 'vsprintf' 함수가 기록한 문자의 길이를 저장하는 변수이다.

'va_start(args, format)':

  • 'va_start'는 가변 인자 처리를 시작하기 위해 호출된다.
  • 이 함수는 'args'를 초기화해서 'format' 이후의 인자들을 처리할 수 있게 한다.

'len = vsprintf(logbuf + offset, format, args)':

  • 'vsprintf' 함수는 가변 인자 목록 args를 이용해서 format에 지정된 형식대로 문자열을 logbuf에 기록한다.
  • logbuf + offset 은 로그 메시지가 기록될 위치를 지정한다.
  • 기록된 문자열의 길이가 len에 저장된다.

'va_end(args)':

  • va_end는 가변 인자 처리가 끝났음을 알리기 위해 호출된다.

offset += len 을 통해 다음 로그 메시지가 기록될 위치를 업데이트하고, log message의 길이가 총 4096 바이트 이상되면 버퍼에 있는 내용을 파일에 기록한다. 그후, offset을 초기화해서 buffer의 처음부터 기록할 수 있게 한다.
fflush(fp)는 file pointer fp와 관련된 출력 버퍼를 비운다. 이를 통해 파일에 즉시 기록된다.

0개의 댓글