활자를 찍다

printk


printkLinux 커널 인터페이스의 C 함수로 커널 로그에 메시지를 인쇄한다.[1]형식 문자열이라는 문자열 매개 변수를 허용하며, 임의 수의 다양한 데이터 유형 매개 변수를 문자열로 렌더링하는 방법을 지정한다.[1]그런 다음 문자열은 커널 로그에 인쇄된다.[1]

그것은 a를 제공한다.printf-추상과 같은 추상화와 형식 문자열 및 인수의 구문 분석은 다음과 유사하게 된다.printf그것은 커널로부터 메시지를 기록하기 위해 이 기능이 필요한 커널 프로그래머들을 위한 디버깅 툴의 역할을 한다.[1][1]

printk기능 프로토타입:

안쪽에 활자를 찍다(경시하다 마를 뜨다 *fmt, ...); 

C 표준 라이브러리 및 해당 라이브러리printf커널 모드에서는 함수를 사용할 수 없으므로 다음이 필요함printk.[2]

와의 차이점printf

함수printk에 근거하다printf, 그러나 항상 같은 방법으로 사용될 수 없다.printf사용된다.[1]

로그 수준

printk발신자가 송신되는 메시지의 유형과 중요도를 지정할 수 있다.[1]이 지정자를 로그 수준이라고 한다.[1]

로그 수준은 커널 메시지 로그로 보낼 메시지의 유형을 지정한다.[1]로그 수준은 생성될 메시지의 시작까지 로그 수준을 설명하는 문자열을 미리 입력(C의 문자열 리터럴 연결 사용)하여 지정된다.[1]예를 들어, 메시지는 다음에서 생성될 수 있다.KERN_INFO다음을 사용하여:[1]

활자를 찍다(KERN_INFO "메시지: %s\n", 아그); 

로그 수준을 지정하는 문자열은 헤더 문자의 ASCII 시작 문자 다음에 로그 수준을 설명하는 숫자 또는 메시지가 이전 메시지의 연속임을 나타내는 'c' 문자로 구성된다.[1][3]해석과 함께 다음과 같은 로그 수준이 아래에 제시되어 있다.[4]

0 케른_이머징 비상 상태, 시스템이 작동하지 않을 경우
1 KERN_ALERT 즉각적인 주의가 필요한 문제
2 KERN_CRIT 위급한 상태
3 KERN_ERR 에러
4 KERN_WARNING 경고
5 KERN_NOTICE 평범하지만 어쩌면 주목할 만한 조건
6 KERN_INFO 정보 메시지
7 KERN_DEBUG 일반적으로 불필요한 디버그 메시지

로그 수준을 지정하지 않은 경우 기본 로그 수준은KERN_WARNING커널 자체에[citation needed] 다른 기본값이 설정되지 않은 경우.[1]

로그 수준이 정의되어 있음<linux/kern_levels.h>.[3] 인쇄되는 로그 수준은 sysctl 파일을 사용하여 구성됨/proc/sys/kernel/printk.[1]

포인터 형식

%p형식 지정자(포인터 인쇄에 사용됨)printf포맷 모드를 추가하기 위해 확장(예: 인쇄 요청)struct sockaddr *사용.%pISpcIPv4/v6 주소와 포트를 인간 친화적인 형식으로 인쇄한다(예: "1.2.3.4:12345" 또는 "[1:2:3:4:5:5:7:8]:12345").[5]

부동 소수점 지지대 없음

동안printf부동 소수점 번호의 출력 지원,printk리눅스 커널은 커널 내에서 부동 소수점 번호를 사용하지 않기 때문에 그렇지 않다.[5][6]

설명

함수는 시스템 콘솔에 대한 액세스를 제어하는 세마포어 잠금을 시도한다.[1][7]성공하면 출력이 기록되고 콘솔 드라이버가 호출된다.[1]세마포어를 획득할 수 없는 경우 출력이 로그 버퍼에 배치되고 콘솔 세마포어의 현재 홀더가 콘솔 세마포어를 해제할 때 새 출력을 알아차리고 버퍼링된 출력을 세마포어를 해제하기 전에 콘솔로 전송한다.[1]

이 지연된 인쇄의 한 가지 효과는 전화를 거는 코드다.printk그리고 나서 인쇄할 로그 레벨이 변경될 수 있다.실제 인쇄가 발생했을 때 인쇄할 로그 수준을 검사하기 때문이다.[1]

함수printk커널 부팅 프로세스의 초기 단계에서 시스템 콘솔이 초기화되지 않은 경우를 제외하고 커널의 어느 곳에서든 호출할 수 있다.[4]대체 함수early_printk일부 아키텍처에서 구현되어 동일한 방식으로 사용됨printk부팅 프로세스 [4]초기 단계에서

참조

  1. ^ a b c d e f g h i j k l m n o p q r "Message logging with printk — The Linux Kernel documentation". www.kernel.org. Retrieved 2020-09-09.
  2. ^ ISO/IEC 9899:2018. International Standards Organization. 2018.
  3. ^ a b "kern_levels.h". GitHub. Retrieved 2020-09-09.
  4. ^ a b c "printk()". archive.is. 2007-08-30. Retrieved 2020-09-09.
  5. ^ a b "How to get printk format specifiers right — The Linux Kernel documentation". www.kernel.org. Retrieved 2020-09-09.
  6. ^ "Re: Linux kernel and floating point". www.redhat.com. Retrieved 2020-09-09.
  7. ^ "Driver Basics — The Linux Kernel documentation". www.kernel.org. Retrieved 2020-09-09.

외부 링크