Я работаю над встроенным linux с busybox. В рамках моего приложения у меня есть скрипт rc.init E80-startmyprog. Этот скрипт вызывает мою программу prog.Сигнал обработчика SIGHUP сбрасывается по умолчанию при использовании системы() во встроенном Linux с busybox
trap "" HUP
startmyprog >${LOGFILE} 2>&1 </dev/null &
startmyprog() {
prog
}
В моей программе я вижу, что обработчики сигналов настроены на игнорирование SIGHUP. Я проверяю, что с
struct sigaction act;
sigaction(1, NULL, &act);
printf("action %p\n", act.sa_sigaction); // prints out 1 -> SIG_IGN
Теперь на некоторое время в моей программе мне нужно, чтобы начать новый процесс, придать ему некоторый входной сигнал и проверить, если он печатается «да» на стандартный вывод. Я использую систему для этого.
const int ret = system("[ `echo input | second_process` == yes ]");
Нормальное поведение является то, что WIFEXITED(ret)
верно и что WEXITSTATUS(ret)
является 0 или 1.
Но в некоторых случаях с несчастным временем WIFSIGNALED(ret)
верно и WTERMSIG(ret)
является 1 (SIGHUP).
Отладка показывает, что если Iexecl("second_process", "second_process", (char*)NULL)
состояние обработчика сигнала во втором_процессе установлено правильно, SIGHUP = игнорировать. Но если я использую system
, то second_process имеет SIGHUP = default.
Мои вопросы:
Что там происходит? Кто перезагружает обработчик сигнала SIGHUP при запуске? Это оболочка? Есть ли способ предотвратить это? (На странице sh man я не видел вариант командной строки, который выглядит так.)
Я знаю, что я мог бы сделать обходной путь и настроить канал, fork, exec second_process, записать вход в трубу, прочитать вывод из трубы и синтаксический анализ, но это много чего по сравнению с системой одного лайнера, и есть хорошие шансы, что я что-то пропущу и ошибаюсь.
Попробуйте 'strace -ff -o/tmp/foo program' - это запустит strace в вашей программе, следуя за вилками и сохраняя результаты трассировки за процесс в /tmp/foo.NNNNN. Я думаю, вы обнаружите, что система (3) НЕ сбрасывает обработчик SIGHUP, хотя, возможно, что-то еще. –
@ Гиль Гамильтон Хорошая точка. Раньше я запускал strace, но только для немного других тестов. Я переделал вашу предложенную strace. Журналы показывают, что порожденные sh вызовы rt_sigaction: 'rt_sigaction (SIGHUP, {0x10000000, [], 0}, {SIG_DFL, [], SA_NOCLDSTOP}, 16) = 0'. –