Почему терминал принимает входной сигнал построчно?

Я понимаю, что ash является производным от Bourne, поэтому я думаю, что это должно работать:

if ping -c1 www.google.com > /dev/null; then
    echo "It worked"
else
    echo "No dice"
fi
2
21.02.2019, 06:37
1 ответ

Это очень просто.

Внешняя команда echo, которую вы запускаете из strace, скорее всего, является командой GNU coreutils. Это написано на языке программирования C и использует функции библиотеки времени выполнения C, такие как putchar()и fputs(), для записи того, что необходимо для записи в стандартный вывод программы.

В языке C вывод на стандартный вывод может быть полностью буферизованным , строковым буферизованным или небуферизованным . Правила того, что происходит, на самом деле являются частью спецификации языка C, применяются во всех операционных системах и написаны в абстрактных терминах того, можно ли определить, что стандартный вывод «не относится к интерактивному устройству».

В операционных системах Unix и Linux конкретный способ их применения заключается в том, что стандартный вывод полностью буферизуется, если функция isatty()говорит, что файловый дескриптор не является терминалом. Вот что такое «интерактивное устройство» в данном случае. В противном случае стандартный вывод в вашей операционной системе буферизуется строкой. Стандарт языка C не требует этого. Это то, что библиотека GNU C дополнительно документирует, что она делает, помимо того, что говорит стандарт языка C.

Таким образом, когда стандартный вывод вашей echoкоманды является не терминалом, а файлом, библиотека C в программе буферизует все отдельные записи в стандартный вывод и выполняет один большой write()вызов, когда буфер заполнен. или когда программа завершится. В то время как, когда стандартный вывод является терминалом, библиотека C только буферизует вещи до тех пор, пока не будет выведен символ перевода строки , после чего он write()является содержимым буфера.

Отсюда наблюдаемые системные вызовы.

Дополнительная литература

7
27.01.2020, 21:52

Теги

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