Я предполагаю, что вы находитесь на Linux или какой-либо другой системе POSIX
Вы должны получить более полное представление о программировании Linux на чтение Advanced Linux Programming.Похоже, вы недопонимаете processes и signals.
Вы не можете поймать сигнал внутри процесса, запускающего вашу C-программу из какой-либо оболочки (либо родительская оболочка, либо любая дочерняя оболочка, запущенная с system(3). Таким образом, вывод trap -p
из любой оболочки не имеет отношения к вашей программе (но для оболочка запустить его). Таким образом, даже при использовании popen(3) как FILE*fp = popen("trap -p", "r");
(или ....), то чтение из fp
(и наконец pclose
-ную его) бесполезно.
Если вы хотите, чтобы обрабатывать сигналы в вашей программе C , сначала прочитайте signal(7), затем прочитайте документацию POSIX signal.h (уведомление)); читайте также sigaction(2), fork(2), execve(2)
Я хочу, чтобы иметь возможность: добавлять новые ловушки внутри моей программы
Это не имеет никакого значения для программ C, работающих на Linux или POSIX. Программа C может обрабатывать (с большой осторожностью и осторожностью!) Некоторые signals, которые являются не ловушками.
[Я хочу:] дисплея текущих настроек ловушки
Опять же, "ловушка" не имеет смысла внутри C или программы C++, но signals делать. Вам действительно не нужно отображать текущие установленные обработчики сигналов, потому что вы их задали раньше. И sigaction(2) принимает третий oldact Указатель на проведение предыдущий сигнал действия.
Процессорtraps (которые только обрабатываются с помощью кода ядра, а не с помощью кода приложения) являются отдаленно и косвенно связаны ссигналов. Например, page fault (для реализации virtual memory) часто обрабатывается ядром, чтобы заполнить page cache страницей с диска (файловая или своп-зона), но может перевести на сигнал SIGSEGV
(для segmentation fault), отправленный процессу, что часто заканчивается core dump.
Если установить какой-то обработчик сигнала в вашей программе C, убедитесь, чтобы понять, что это асинхронного сигнал безопасных функций (только те, которые вам позволено звонить из обработчика сигналу, в частности, вызывая fprintf
или malloc
- даже косвенно - запрещено, так что это undefined behavior). Полезный способ обработки сигнала состоит в том, чтобы объявить некоторые переменные volatile sig_atomic_t
и установить их внутри обработчиков сигналов (и протестировать и сбросить их за пределами, например, в вашем цикле событий).
Оболочка trap
builtin используется для управления некоторыеsignals (а также выхода и условия ошибки). Для управления сигналами в C используйте sigaction(2). Чтобы запустить что-то на exit(3) времени, используйте atexit(3).Для обработки условия ошибки, убедитесь, что для проверки каждого отдельного syscalls(2) и большинство библиотечных функций (как scanf(3) или malloc(3) и т.д. и т.п. ... см intro(3)), используя errno(3)
Что произойдет, если вы запустите его без 'системы («баш») ; '? – Hexaholic
И что вы имеете в виду «исчезает»? – 123
trap: Illegal option -p – br33f