2015-12-15 4 views
-3

Каков наилучший способ выполнения команды, такой как «trap -p» и т. Д. Непосредственно из программы, написанной на ANSI C? Я пробовал:Как выполнить команду из программы C

system("bash"); 
system("trap -p"); 

Но когда я добавить систему ("Баш") программа dissappears. Как предотвратить его расплывчатость или лучший способ выполнить такие команды?

EDIT:

Спасибо всем за помощь.

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

Возможно ли достичь этого относительно простым способом?

+0

Что произойдет, если вы запустите его без 'системы («баш») ; '? – Hexaholic

+0

И что вы имеете в виду «исчезает»? – 123

+0

trap: Illegal option -p – br33f

ответ

1

Я предполагаю, что вы находитесь на 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 и установить их внутри обработчиков сигналов (и протестировать и сбросить их за пределами, например, в вашем цикле событий).

Оболочка trapbuiltin используется для управления некоторыеsignals (а также выхода и условия ошибки). Для управления сигналами в C используйте sigaction(2). Чтобы запустить что-то на exit(3) времени, используйте atexit(3).Для обработки условия ошибки, убедитесь, что для проверки каждого отдельного syscalls(2) и большинство библиотечных функций (как scanf(3) или malloc(3) и т.д. и т.п. ... см intro(3)), используя errno(3)

2

Но когда я добавляю систему («баш») программа dissappears

Да, Баш сейчас работает и ваша C программа ждет его завершения. Кажется, он исчез, потому что вы увидите новую оболочку, запущенную в вашем терминале. Попробуйте ввести exit, и ваша программа на C продолжит работу. Вы можете подтвердить это, добавив инструкцию печати после system("bash");.

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

system("bash -i -c 'trap -p'"); 

Из этого, казалось бы, что trap требует телетайп, который неинтерактивный Баш Безразлично Не знаю.

Или вы могли бы поместить команду ловушки в сценарии и запустить его так:

system("bash script.sh"); 

Содержание script.sh:

echo Before setting trap... 
trap -p 
trap somecmd SIGINT 
echo After setting a trap... 
trap -p 

В выходе вы должны увидеть, что изначально было не ловушек (при условии, что ни один из них не был унаследован от оболочки, которая запускала вашу программу на C), а затем trap должен показать вновь созданную ловушку.

+0

Это правильно, однако, когда я печатаю exit, то в чем смысл запускать bash? Я хочу, чтобы он сначала печатал список из «trap -p». И я хочу, чтобы это было сделано автоматически, без взаимодействия с пользователем. – br33f

+0

@ br33f: Это ваш код, который запускает бессмысленный баш, и вы сказали, что программа «исчезает», поэтому я подумал, что это может быть ваша трудность. Во всяком случае, я обновил свой ответ с возможным решением. – mhawke

1

Вместо того чтобы запускать интерактивный bash, кажется, что вы ищете способ запустить trap -p в неинтерактивной оболочке Bash. Вот как вы это делаете.

system("bash -c 'trap -p'"); 

Однако ваши обработчики сигналов C-уровня не будет виден в trap -p выходе. Баш может знать только о обработчиках ловушек, которые были определены в Bash; и shell, который вы запускаете, не будет иметь (если они не наследуются от оболочки, которую вы использовали для запуска вашей программы на C).

+0

Я собирался предложить это, но это не поможет в ситуации ОП, поскольку они используют sh для установки ловушек. – 123

Смежные вопросы