Может ли функция, которая выполняется периодически, и когда она получает сигнал, быть критической областью? - PullRequest
1 голос
/ 11 июня 2019

У меня есть скрипт, выполняемый как служба с функцией do_firewall, которая запускается каждые 10 секунд.Эта же функция может быть вызвана, когда процесс сценария получает сигнал SIGUSR1.Является ли эта функция критической областью?

Код выглядит следующим образом:

SIGUSR1=10

trap do_firewall SIGUSR1 

do_firewall() {
    # manage some iptables commands implemented in an idempotent 
    # mechanism

    # is this a critical region?
}

###################################################################
# Main block
###################################################################
while true; do
    # If there is no do_firewall process running
    do_firewall
    sleep 10
done

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

Я думаю, что нет, но я не уверен на 100%.

В случае, если я должен добавить что-то подобное в функцию do_firewall:

do_firewall() {
    (
        flock -e 200
        # critical region
    ) 200>/var/run/lockfile
}

Кроме того, 200 безопасный дескриптор файла для использования?

1 Ответ

0 голосов
/ 11 июня 2019

Да, SIGUSR1 вполне может прибыть при выполнении do_firewall. Он должен быть повторно входящим, если вы собираетесь использовать его как обычный вызов функции и как обработчик сигнала.

Кроме того, 200 безопасный дескриптор файла для использования?

Конечно, используй что хочешь. Вам не нужно идти так высоко. Это нормально использовать 3. Номера дескрипторов файлов находятся под контролем вашего скрипта. 3 является наиболее распространенным. Некоторые люди начинают с 10. Bash начинается с 63 и начинает обратный отсчет, если вы используете его синтаксис >{var} для автоматического назначения произвольных номеров FD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...