Почему GNU make игнорирует SIGINT, но не выполняет следующие команды? - PullRequest
0 голосов
/ 22 апреля 2019

Я хочу, чтобы команда make выполнила команду в строке 92 (killall), даже если предыдущая команда в строке 91 (gdb) была остановлена ​​командой SIGINT (с помощью Ctrl + C):

 88 debug:                                                                                                                                                                                     
 89     make all                                                                                                                                                                               
 90     make flash                                                                                                                                                                             
 91     -$(GDB) $(PROJ_NAME).elf $(GDBCOMMANDS)                                                                                                                                                
 92     killall openocd

Однако, хотя make print печатает информацию о игнорировании прерывания, он все равно не запускает killall впоследствии:

make: [Makefile:91: debug] Interrupt (ignored)

Все работает как положено, когда я покидаю GDB без SIGINT - killall выполняется.

Почему make не пытается выполнить killall в приведенном выше сценарии? Как мне заставить это работать?

Вы можете самостоятельно проверить проблему с помощью этого Makefile (эхо не будет выполнено, если вы нажмете CTRL + C в окне man перед выходом, но оно будет работать, если вы просто выйдете с помощью 'q'):

all:
    -man man                                                                                                                                                                                   
    echo 'It worked!'

1 Ответ

0 голосов
/ 22 апреля 2019

Проблема в том, что ^ C также перехватывается make (когда вы запускаете ^ C, все процессы в группе процессов терминала получают сигнал), и make завершает работу (после очистки), поэтому он никогда не пытается запустить какой-либобольше команд, как если бы вы вводили ^ C во время процесса make.

Единственный способ избежать этого - убедиться, что make вообще не получил SIGINT, и единственный способ сделать это.то есть изменить группу процессов.Я не уверен, есть ли какая-нибудь удобная утилита, которая сделает это за вас.

Моя рекомендация - не пытаться вызывать отладчики или другие интерактивные программы из рецепта make.Он не предназначен для этого.В дополнение к вышеперечисленным проблемам, вы обнаружите, что если вы попытаетесь запустить с включенными параллельными сборками, то, поскольку только один процесс может получить стандартный ввод из терминала, будет выбран случайный, чтобы получить «настоящий» стандартный ввод, а другиезакройте их stdin или прочитайте из / dev / null или еще чего-нибудь.

Вместо этого, почему бы просто не создать сценарий оболочки для отладки, который будет запускать необходимые команды make, а затем вызывать gdb.Этот сценарий оболочки может использовать trap для перехвата SIGINT и игнорирования его, чтобы всегда выполнять очистку.

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