□ printk()

  • printf()와 유사하지만 커널의 메세지를 출력하고 관리할 수 있는 특성이 있다.
  • 메세지 기록 관리를 위한 로그 레벨의 지정
  • 원형 큐 구조의 관리
  • 출력 디바이스의 다중 지정
  • 콘솔에서 확인하거나 dmesg 명령을 이용해서 로그 파일을 확인

 

 

로그 레벨 지정

  • 로그 레벨은 printk() 함수에 전달되는 문자열의 선두 문자에 "<1>"과 같이 숫자로 등급을 표현한다.
  • linux/kernel.h 에 정의된 선언문을 이용이 바람직하다.

 

상수 선언문 

의미 

#define KERN_EMERG 

<0> 시스템이 동작하지 않는다. 

#define KERN_ALERT

<1> 항상 출력된다.

#define KERN_CRIT

<2> 치명적인 정보

#define KERN_ERR

<3> 오류 정보

#define KERN_WARNING

<4> 경고 정보

#define KERN_NOTICE

<5> 정상적인 정보

#define KERN_INFO

<6> 시스템 정보

#define KERN_DEBUG

<7> 디버깅 정보

 

 

 

레벨에 대한 표시를 하지 않으면 KERN_WARNING과 같은 레벨이다.

다음의 처리 결과는 모두 같다.

  • printk(KERN_WARNING "system ok\n");

  • printk("<4>" "system ok\n");

  • printk("<4> system ok\n");

  • printk("system ok\n");

 

 

 

원형 큐 구조 관리

  • 커널 메세지는 커널 내부에 있는 원형 큐 형식의 로그 버퍼에 저장딘다.

  • 이 로그 버퍼의 크기는 CONFIG_LOG_BUF_SHIFT 값으로 지정된다. (2의 승수 표현 : default 17 -> 131,072Byte(128Kbyte))

    • 정의된 헤더) include/config/log/buf/shift.h

  • 로그 버퍼는 일반적으로 콘솔에 출력된다.

 

 

커널 메세지 관리 데몬

  • klogd : 커널에서 발생하는 메세지를 기록하고 관리한다.

  • syslogd : 커널에서 발생하는 메세지와 응용 프로그램에서 요청한 시스템 정보를 기록하고 관리한다.

 

 

 

/proc/kmsg

  • 커널 메시지가 발생할 때마다 관찰할 수 있다.

  • cat /proc/kmsg

  • dmesg -> 커널 메시지 출력

 

 

 

printk() 사용 시 주의점

  • printk를 과도하게 사용하지 않는다.

  • 실행시간이 길다.

  • 개행 문자가 있어야 출력을 시작한다.

  • '\n'을 포함 하도록 한다.

 

 

 

#define DEV_DEBUG

#ifdef DEV_DEBUG

            #define gprintk(fmt, x... ) printk("%s: " fmt, __FUNCTION__, ## x)

#else

            #define gprintk(x...) do {} while(0)

#endif

 

 

+ Recent posts