несколько прерываний удара для того же сигнала

Я думаю, что если вы хотите сопоставление по лицу, то вам, возможно, придется дублировать вершины. В основном уникальная вершина + нормальный + ультрафиолетовый комбо для всего. В противном случае вам понадобится несколько индексных буферов, один для вершин, один для нормалей, один для uvs. Я склонен не слишком беспокоиться о количестве вершинных данных. Что действительно влияет на производительность, так это вызовы отрисовки. Большинство графических процессоров могут обрабатывать> 1 м вершин в кадре, но максимально в 300 - 1000 вызовов отрисовки. Я упрощаю, но это приблизительная оценка.

53
задан Jolta 15 February 2017 в 03:36
поделиться

3 ответа

Редактировать:

Похоже, я неправильно понял вопрос. Ответ прост:

handler1 () { do_something; }
handler2 () { do_something_else; }
handler3 () { handler1; handler2; }

trap handler3 SIGNAL1 SIGNAL2 ...

Оригинал:

Просто перечислите несколько сигналов в конце команды:

trap function-name SIGNAL1 SIGNAL2 SIGNAL3 ...

Вы можете найти функцию, связанную с конкретным сигналом, используя trap -p :

trap -p SIGINT

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

Вы можете добавить дополнительный сигнал к известному, выполнив следующие действия:

eval "$(trap -p SIGUSR1) SIGUSR2"

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

Если вы используете Bash> = 3.2, вы можете сделать что-то вроде этого, чтобы извлечь функцию по сигналу. Обратите внимание, что это не совсем надежно, потому что могут появиться другие одинарные кавычки.

[[ $(trap -p SIGUSR1) =~ trap\ --\ \'([^\047]*)\'.* ]]
function_name=${BASH_REMATCH[1]}

Затем вы можете перестроить свою команду прерывания с нуля, если вам нужно использовать имя функции и т. Д.

29
ответ дан 7 November 2019 в 08:40
поделиться

Простые способы сделать это

  1. , Если все функции обработки сигнала, знает одновременно, то следующее достаточно (сказал Jonathan):
trap 'handler1;handler2;handler3' EXIT
  1. Еще, если существует существующий обработчик (обработчики), который должен остаться, тогда новые обработчики могут легко быть добавлены как это:
trap "$( trap -p EXIT | cut -f2 -d \' );newHandler" EXIT
  1. , Если Вы не знаете, существуют ли существующие обработчики, но хотят сохранить их в этом случае, сделать следующее:
 handlers="$( trap -p EXIT | cut -f2 -d \' )"
 trap "${handlers}${handlers:+;}newHandler" EXIT
  1. Это может быть разложено на множители в функции как этот:
trap-add() {
    local sig="${2:?Signal required}"
    hdls="$( trap -p ${sig} | cut -f2 -d \' )";
    trap "${hdls}${hdls:+;}${1:?Handler required}" "${sig}"
}

export -f trap-add

Использование:

trap-add 'echo "Bye bye"' EXIT
trap-add 'echo "See you next time"' EXIT

Комментарий : Это работает, только имеет долго, поскольку обработчики являются именами функций, или простые инструкции, которые не сделали, содержат любой простой cote (простые конфликты Коутса с cut -f2 -d \').

0
ответ дан 7 November 2019 в 08:40
поделиться

Нет

Лучшее, что вы могли бы сделать, это запустить несколько команд из одной ловушки для данного сигнала, но вы не можете иметь несколько одновременных ловушек для одного сигнала . Например:

$ trap "rm -f /tmp/xyz; exit 1" 2
$ trap
trap -- 'rm -f /tmp/xyz; exit 1' INT
$ trap 2
$ trap
$

Первая строка устанавливает ловушку на сигнал 2 (SIGINT). Вторая строка печатает текущие ловушки - вам нужно будет захватить стандартный вывод из этого и проанализировать его для нужного вам сигнала. Затем вы можете добавить свой код к тому, что уже было, отметив, что предыдущий код, скорее всего, будет включать операцию «выхода». Третий вызов ловушки очищает ловушку на 2 / INT. Последний показывает, что выдающихся ловушек нет.

Вы также можете использовать trap -p INT или trap -p 2 , чтобы распечатать ловушку для определенного сигнала.

11
ответ дан 7 November 2019 в 08:40
поделиться
Другие вопросы по тегам:

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