Printk

printk is a C function from the Linux kernel interface that prints messages to the kernel log.[1] It accepts a string parameter called the format string, which specifies a method for rendering an arbitrary number of varied data type parameter(s) into a string.[1] The string is then printed to the kernel log.[1]

It provides a `printf`-like abstraction and its parsing of the format string and arguments behave similarly to `printf`.[1] It acts as a debugging tool for kernel programmers who need this function for logging messages from the kernel.[1]

The `printk` function prototype is:

int printk(const char *fmt, ...);

C standard library and its `printf` function is unavailable in kernel mode, hence the need for `printk`.[2]

## Contents

* 1 Differences from printf
* 1.1 Log levels
* 1.2 Pointer formats
* 1.3 No floating point support
* 2 Description
* 3 References
* 4 External links

## Differences from `printf`

The function `printk` is based on `printf`, but cannot always be used in the same way that `printf` is used.[1]

### Log levels

`printk` allows a caller to specify the type and importance of the message being sent.[1] This specifier is called the log level.[1]

The log level specifies the type of message being sent to the kernel message log.[1] The log level is specified by prepending (using C's string literal concatenation) a string describing the log level to the start of the message to be produced.[1] For example, a message could be produced at the `KERN_INFO` using the following:[1]

printk(KERN_INFO "Message: %s\n", arg);

The string specifying the log level consists of the ASCII start of header character followed by a digit describing the log level or the character 'c' to indicate the message is a continuation of the previous message.[1][3] The following log levels, along with their interpretations, are given below.[4]

0 | KERN_EMERG | An emergency condition; the system is probably dead

|
|

1 | KERN_ALERT | A problem that requires immediate attention
2 | KERN_CRIT | A critical condition
3 | KERN_ERR | An error
4 | KERN_WARNING | A warning
5 | KERN_NOTICE | A normal, but perhaps noteworthy, condition
6 | KERN_INFO | An informational message
7 | KERN_DEBUG | A debug message, typically superfluous

When a log level is not specified, the default log level is `KERN_WARNING`,[1] unless a different default has been set in the kernel itself, such as with the `loglevel=` boot argument.[5]

Log levels are defined in `<linux/kern_levels.h>`.[3] Which log levels are printed is configured using the sysctl file `/proc/sys/kernel/printk`.[1]

### Pointer formats

The `%p` format specifier (used for printing pointers in `printf`) is extended to add additional formatting modes, for example, requesting to print a `struct sockaddr *` using `%pISpc` would print an IPv4/v6 address and port in a human-friendly format (e.g. "1.2.3.4:12345" or "[1:2:3:4:5:6:7:8]:12345").[6]

### No floating point support

While `printf` support output of floating point numbers, `printk` does not,[6] since the Linux kernel does not use floating point numbers within the kernel.[7]

## Description

The function tries to lock the semaphore controlling access to the system console.[1][8] If it succeeds, the output is logged and the console drivers are called.[1] If it is not possible to acquire the semaphore the output is placed into the log buffer, and the current holder of the console semaphore will notice the new output when they release the console semaphore and will send the buffered output to the console before releasing the semaphore.[1]

One effect of this deferred printing is that code which calls `printk` and then changes the log levels to be printed may break. This is because the log level to be printed is inspected when the actual printing occurs.[1]

The function `printk` can be called from anywhere in the kernel except during the very early stages of the kernel boot process, when the system console is not initialised.[4] The alternative function `early_printk` is implemented on some architectures and is used identically to `printk` during the early stages of the boot process.[4]

## References

1. ↑ 1.00 1.01 1.02 1.03 1.04 1.05 1.06 1.07 1.08 1.09 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 "Message logging with printk — The Linux Kernel documentation". https://www.kernel.org/doc/html/latest/core-api/printk-basics.html.
2. ↑ ISO/IEC 9899:2018. International Standards Organization. 2018.
3. ↑ 3.0 3.1 "kern_levels.h" (in en). https://raw.githubusercontent.com/torvalds/linux/8f02f363f76f99f08117336cfac7f24c76b25be3/include/linux/kern_levels.h.
4. ↑ 4.0 4.1 4.2 "printk()". 2007-08-30. http://book.chinaunix.net/special/ebook/Linux_Kernel_Development/0672327201/ch18lev1sec3.html.
5. ↑ "The kernel’s command-line parameters" (in en). https://www.kernel.org/doc/html/v4.14/admin-guide/kernel-parameters.html.
6. ↑ 6.0 6.1 "How to get printk format specifiers right — The Linux Kernel documentation". https://www.kernel.org/doc/html/latest/core-api/printk-formats.html#printk-specifiers.
7. ↑ "Re: Linux kernel and floating point.". https://www.redhat.com/archives/axp-list/2002-April/msg00121.html.
8. ↑ "Driver Basics — The Linux Kernel documentation". https://www.kernel.org/doc/html/latest/driver-api/basics.html#c.console_lock.

## External links

* Format Reference

0.00

(0 votes)

Original source: https://en.wikipedia.org/wiki/Printk. Read more

|

Retrieved from "https://handwiki.org/wiki/index.php?title=Printk&oldid=298739"