Как проверить ошибку во время выполнения программы в bash?

#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, игнорируется оболочкой и вызываемыми ею командами».