#bash
#bash
Вопрос:
Я создал программу на C, которая при каждом запуске выдавала ошибку ошибки сегментации. А затем я создал сценарий bash следующим образом:
cat input.txt | ./a.out 1> output.txt 2> error.txt
cat error.txt
Вывод второй строки должен был быть чем-то вроде ошибки сегментации (сброс ядра)
Но вместо этого это пустой файл.
Как мне зафиксировать ошибки во время выполнения программы на C?
Комментарии:
1. Каков приоритет оператора для операторов pipe и stderr-перенаправления?
2. @Dai, извините, я не понял вашего вопроса. Можете ли вы упростить это?
3. Избегайте ненужного использования
cat
(например./a.out <input.txt >output.txt 2>error.txt
Ответ №1:
Ваша проблема связана с тем фактом, что Segmentation fault (core dumped)
сообщение генерируется не вашей программой, оно генерируется оболочкой, в которой вы можете a.out
выполнить команду. Процесс выглядит примерно так:
- Ваша программа генерирует ошибку segfault
- Ваша программа получает
SIGSEGV
сигнал - Ваша программа завершает работу
wait()
Системный вызов, выполняемый вашей оболочкой, завершается с кодом состояния, который указывает на аварийный выход вашей программы из-заSIGSEGV
сигнала.- Оболочка выводит сообщение об ошибке
Это обсуждается несколько более подробно в этом ответе.
Если вы хотите зафиксировать этот результат, вы можете попробовать что-то вроде:
$ sh -c 'trap "" 11; ./a.out' 1> output.txt 2> error.txt
$ cat error.txt
Segmentation fault (core dumped)
Это приведет к запуску вашего кода в подпроцессе и запретит обработку segfault по умолчанию командной оболочкой.
Комментарии:
1. Что делает «» 11; делать внутри ловушки?
2.
man bash
имеет ответ: «Если arg является нулевой строкой, сигнал, указанный каждым sigspec, игнорируется оболочкой и вызываемыми ею командами».