принтк
printk — это функция C из интерфейса ядра Linux , которая печатает сообщения в журнал ядра. [1] Он принимает строковый параметр, называемый строкой формата , который определяет метод для преобразования произвольного числа параметров различных типов данных в строку. [1] Затем строка выводится в журнал ядра. [1]
Это обеспечивает printf-like
абстракция и ее анализ строки формата и аргументов ведут себя аналогично printf
. [1] Он действует как инструмент отладки для программистов ядра, которым нужна эта функция для регистрации сообщений ядра. [1]
The printk
Прототип функции:
int printk(const char *fmt, ...);
Стандартная библиотека C и ее printf
функции недоступны в режиме ядра, следовательно, необходимо printk
. [2]
Отличия от printf
[ редактировать ] Функция printk
основан на printf
, но не всегда может использоваться таким же образом, как printf
используется. [1]
Уровни журнала
[ редактировать ]printk
позволяет вызывающему абоненту указать тип и важность отправляемого сообщения. [1] Этот спецификатор называется уровнем журнала. [1]
Уровень журнала определяет тип сообщения, отправляемого в журнал сообщений ядра. [1] Уровень журнала указывается путем добавления (с использованием конкатенации строковых литералов C ) строки, описывающей уровень журнала, к началу создаваемого сообщения. [1] Например, сообщение может быть создано в KERN_INFO
используя следующее: [1]
printk(KERN_INFO "Message: %s\n", arg);
Строка, определяющая уровень журнала, состоит из начального символа заголовка ASCII, за которым следует цифра, описывающая уровень журнала, или символ «c», указывающий, что сообщение является продолжением предыдущего сообщения. [1] [3] Следующие уровни журнала вместе с их интерпретациями приведены ниже. [4]
0 | КЕРН_EMERG | Аварийное состояние; система скорее всего мертва |
1 | CORE_ALERT | Проблема, требующая немедленного внимания |
2 | КЕРН_КРИТ | Критическое состояние |
3 | КЕРН_ЕРР | Ошибка |
4 | КЕРН_ПРЕДУПРЕЖДЕНИЕ | Предупреждение |
5 | CORE_NOTICE | Нормальное, но, возможно, примечательное состояние. |
6 | CORE_INFO | Информационное сообщение |
7 | КЕРН_ДЕБУГ | Отладочное сообщение, обычно лишнее |
Если уровень журнала не указан, уровень журнала по умолчанию KERN_WARNING
, [1] если в самом ядре не установлено другое значение по умолчанию, например, с помощью loglevel=
аргумент загрузки. [5]
Уровни журнала определены в <linux/kern_levels.h>
. [3] Какие уровни журнала печатаются, настраивается с помощью sysctl . файла /proc/sys/kernel/printk
. [1]
Форматы указателей
[ редактировать ]The %p
спецификатор формата (используется для печати указателей в printf
) расширен для добавления дополнительных режимов форматирования, например, запроса на печать struct sockaddr *
с использованием %pISpc
будет печатать адрес и порт IPv4/v6 в удобном для человека формате (например, «1.2.3.4:12345» или «[1:2:3:4:5:6:7:8]:12345»). [6]
Нет поддержки с плавающей запятой
[ редактировать ]Пока printf
поддерживает вывод чисел с плавающей запятой, printk
нет, [6] поскольку ядро Linux не использует числа с плавающей запятой внутри ядра. [7]
Описание
[ редактировать ]Функция пытается заблокировать семафор, контролирующий доступ к системной консоли. [1] [8] Если это удалось, выходные данные записываются в журнал и вызываются драйверы консоли. [1] Если невозможно получить семафор, выходные данные помещаются в буфер журнала, и текущий владелец семафора консоли заметит новый вывод, когда он освободит семафор консоли, и отправит буферизованный вывод на консоль перед освобождением семафора. . [1]
Одним из последствий этой отложенной печати является код, который вызывает printk
а затем изменения уровней журнала, которые будут напечатаны, могут сломаться. Это связано с тем, что уровень журнала, который будет распечатан, проверяется во время фактической печати. [1]
Функция printk
может быть вызван из любого места ядра, за исключением самых ранних стадий процесса загрузки ядра; когда системная консоль не инициализирована. [4] Альтернативная функция early_printk
реализован на некоторых архитектурах и используется идентично printk
на ранних стадиях процесса загрузки. [4]
Ссылки
[ редактировать ]- ^ Перейти обратно: а б с д и ж г час я дж к л м н тот п д р «Журнал сообщений с помощью printk — Документация по ядру Linux» . www.kernel.org . Проверено 9 сентября 2020 г.
- ^ ИСО/МЭК 9899:2018 . Международная организация по стандартизации. 2018.
- ^ Перейти обратно: а б "kern_levels.h" . Гитхаб . Проверено 27 сентября 2020 г.
- ^ Перейти обратно: а б с «принтк()» . архив.есть . 30 августа 2007 г. Архивировано из оригинала 30 августа 2007 г. Проверено 9 сентября 2020 г.
- ^ «Параметры командной строки ядра» . ядро.орг . Проверено 27 сентября 2023 г.
- ^ Перейти обратно: а б «Как правильно получить спецификаторы формата printk — Документация по ядру Linux» . www.kernel.org . Проверено 9 сентября 2020 г.
- ^ «Re: Ядро Linux и плавающая запятая» . www.redhat.com . Проверено 9 сентября 2020 г.
- ^ «Основы драйверов — документация по ядру Linux» . www.kernel.org . Проверено 9 сентября 2020 г.