Почему printf не является безопасной функцией asyc?

Решение было простым :Я добавил это в.bashrc

export LOCATE_PATH="$HOME/var/mlocate.db"

Затем запустите новый экземпляр bash, и все в порядке!

-1
13.09.2020, 12:24
2 ответа

printfне является -асинхронным -сигналом -безопасным, потому что, как вы описываете, он в конечном итоге манипулирует глобальным состоянием без синхронизации. Для дополнительного удовольствия, это не обязательно повторный -вход. В вашем примере сигнал может обрабатываться во время работы первого printf, а второй printfможет испортить состояние первого вызова.

Рекомендуемый асинхронный -сигнальный -безопасный подход заключается в том, чтобы обработчик сигнала где-то установил флаг, а основной поток программы обработал этот флаг. Это позволяет избежать проблем с входом re -, сериализует вывод и помогает поддерживать скорость обработчиков сигналов.

1
18.03.2021, 23:05

Is my understanding correct?

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

how can async safe function solve this problem?

Существует два типа асинхронных -сигнальных -безопасных функций:

  • реентерабельные функции, такие как strlen (3 ), которые не изменяют никакой памяти, кроме той, которая используется для хранения их локальных переменных,аргументы и возвращаемое значение.

  • функции, которые являются простыми оболочками системных вызовов, такие как kill (2 ), waitpid (2 )и т. д. :их пользовательская часть полностью реентерабельна, как указано выше, а для части ядра ядро позаботится обо всем.

1
18.03.2021, 23:05

Теги

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