Решение было простым :Я добавил это в.bashrc
export LOCATE_PATH="$HOME/var/mlocate.db"
Затем запустите новый экземпляр bash, и все в порядке!
printf
не является -асинхронным -сигналом -безопасным, потому что, как вы описываете, он в конечном итоге манипулирует глобальным состоянием без синхронизации. Для дополнительного удовольствия, это не обязательно повторный -вход. В вашем примере сигнал может обрабатываться во время работы первого printf
, а второй printf
может испортить состояние первого вызова.
Рекомендуемый асинхронный -сигнальный -безопасный подход заключается в том, чтобы обработчик сигнала где-то установил флаг, а основной поток программы обработал этот флаг. Это позволяет избежать проблем с входом re -, сериализует вывод и помогает поддерживать скорость обработчиков сигналов.
Is my understanding correct?
В основном. Также существует проблема с вложенными вызовами printf, которые наступают друг другу на пятки при настройке смещения и размера буфера (с ), что может привести не только к несогласованности данных, но и к сбоям.
how can async safe function solve this problem?
Существует два типа асинхронных -сигнальных -безопасных функций:
реентерабельные функции, такие как strlen (3 ), которые не изменяют никакой памяти, кроме той, которая используется для хранения их локальных переменных,аргументы и возвращаемое значение.
функции, которые являются простыми оболочками системных вызовов, такие как kill (2 ), waitpid (2 )и т. д. :их пользовательская часть полностью реентерабельна, как указано выше, а для части ядра ядро позаботится обо всем.