Как реализован /dev/null?

Внутри VS Code расширение ShellCheck может быть настроено с необязательными аргументами; из настроек:

ShellCheck Custom Args setting

откройте settings.jsonи добавьте что-то вроде

"shellcheck.customArgs": ["-x"],

(Спасибо муру за подсказку.)

Существует несколько способов использования -xвне зависимости от вызываемого инструментаshellcheck:

  • вы можете установить параметры по умолчанию вSHELLCHECK_OPTS:

    export SHELLCHECK_OPTS='-x'
    
  • вы можете заменить свой двоичный файл:

    mv ~/.cabal/bin/shellcheck{,-real}
    printf '#!/bin/sh\nshellcheck-real -x "$@"\n' > ~/.cabal/bin/shellcheck
    chmod 755 ~/.cabal/bin/shellcheck
    

0
22.09.2021, 20:44
1 ответ

В Linux /dev/nullреализуется рядом функций, включаяwrite_null:

static ssize_t write_null(struct file *file, const char __user *buf,
              size_t count, loff_t *ppos)
{
    return count;
}

Как видите, буфер полностью игнорируется, и все, что делает функция, — это возвращает количество байтов, которое было запрошено для записи.

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

cat /dev/zero > /dev/null

эта стоимость, вероятно, будет преобладать. catчитает со своего входа (или из файлов, которые ему дали ), и записывает на свой выход неоднократно, пока либо не закончатся данные для чтения, либо не перестанет записываться. Однако при чтении из /dev/urandomчтение более сложное , и я ожидаю, что они будут доминировать. В обоих случаях весь «ввод-вывод» управляется ЦП -, и catв конечном итоге будет использовать изрядное количество ЦП (100% одного логического ЦП )— в конечном итоге вызов ядра write_nullкак можно быстрее, который продолжает ничего не делать как можно быстрее.

В более типичных обстоятельствах, когда /dev/nullиспользуется, например, для отбрасывания информационного вывода программы, операций записи будет гораздо меньше, а их общая стоимость будет незначительной по сравнению с тем, что делает программа.

(Кстати, вы найдете реализацию /dev/zeroсразу после /dev/nullв приведенном выше коде.)

4
22.09.2021, 21:23

Теги

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