Создание файла в подкаталогах, которые не существует (../new_folder/new_folder/new_file.ext) )

Эта ссылка, похоже, содержит ответы на ваши вопросы, под названием: Linux Kernel Development Second Edition.

выдержка

printk()

Функция печати ядра, printk(), ведет себя почти идентично функции библиотеки C printf(). Действительно, на протяжении всей этой книги мы не использовали никаких реальных различий. Для большинства намерений это нормально; printk() - это просто имя функции форматированной печати ядра. Однако некоторые отличия все же есть.

Надежность printk()

Одним из свойств printk(), которое быстро воспринимается как должное, является ее надежность. Функция printk() вызывается практически из любой точки ядра в любое время. Она может быть вызвана из контекста прерывания или процесса. Она может быть вызвана, пока удерживается блокировка. Она может быть вызвана одновременно на нескольких процессорах, но при этом не требует от вызывающего удерживать блокировку.

Это устойчивая функция. Это важно, потому что полезность printk() основана на том, что она всегда есть и всегда работает.

Непрочность printk()

Шина в броне прочности printk() действительно существует. Она непригодна для использования до определенного момента в процессе загрузки ядра, до инициализации консоли. Действительно, если консоль не инициализирована, то куда должен быть выведен вывод?

Обычно это не является проблемой, если только вы не отлаживаете проблемы на очень ранних стадиях процесса загрузки (например, в setup_arch(), который выполняет инициализацию, специфичную для архитектуры). Такая отладка является сложной задачей, а отсутствие какого-либо метода печати только усугубляет проблему.

Есть некоторая надежда, но не очень большая. Хардкорные хакеры архитектуры используют аппаратные средства, которые действительно работают (скажем, последовательный порт), для связи с внешним миром. Поверьте мне, это не очень весело для большинства людей. Однако некоторые поддерживаемые архитектуры реализуют разумное решение, а для других (включая i386) существуют патчи, которые также спасают ситуацию.

Решением является вариант printk(), который может выводить данные на консоль в самом начале процесса загрузки: early_printk(). Поведение такое же, как у printk(), изменено только имя и возможность работать раньше. Однако это не переносимое решение, поскольку не во всех поддерживаемых архитектурах реализован такой метод. Однако он может стать вашим лучшим другом, если будет реализован.

Если вам не нужно писать в консоль на очень ранней стадии загрузки, вы можете положиться на printk(), который всегда будет работать.

0
26.11.2018, 16:56
3 ответа

Что касается используемых инструментов :нет. touchпотерпит неудачу (справедливо )если вы пытаетесь работать в несуществующем каталоге, и mkdirделает ровно одно :создает каталоги , не нормально файлы . Две разные работы требуют двух разных инструментов.

Тем не менее, если вы говорите об эффективности с точки зрения количества строк в сценарии или удобочитаемости одной из них, вы можете поместить это в функцию:

seedfile() {
   mkdir -p "$(dirname "$1")"
   touch "$1"
}

seedfile /path/to/location/one/file.txt
seedfile /path/to/somewhere/else/file.txt
seedfile local/paths/work/too/file.txt
2
28.01.2020, 02:18
install -D src_file /tmp/a/b/c/d/e/f/g/h/i/dst_file
install -Dt /tmp/a/b/c/d/e/f/g/h/i your_file

Если вы хотите просто коснуться пустого файла:

install -D /dev/null /tmp/a/b/c/d/e/f/g/h/i/empty_file

Посмотрите справочную страницу install (1 ); у него есть параметры для установки разрешений, сохранения временных меток и т. д.

3
28.01.2020, 02:18

Попробуйте это :mkdir -p a/b/c/d/e && touch $_/file.abcВсегда работай на меня.

1
28.01.2020, 02:18

Теги

Похожие вопросы