$? внутри ловушки Баш

Из скрипта bash я пытаюсь обработать ошибки сегментации из программы на C++. Я прочитал это, используя trap на SIGCHLD может быть использован для этой цели. Внутри ловушки я должен быть в состоянии проверить $? получить код возврата из программы. См. https://unix.stackexchange.com/questions/24307 например.

Это не работает для меня, и я не могу понять, почему.

Вот сценарий:

#! /bin/bash

set -bm

trap 'echo "Trap result code $?"' CHLD

echo "Script: starting program"
./sigsegv
echo "Script: result code from program was $?"

Как вы можете догадаться, sigsegv программа просто вызывает segfault:

#include <csignal>
#include <iostream>

using namespace std;

int main(int argc, char** argv)
{
    cout << "C++ will now cause a SIGSEGV" << endl;
    raise(SIGSEGV);
    cout << "After signal -- shouldn't get here" << endl;
    return 0;
}

Когда я запускаю скрипт оболочки, я получаю это:

$./wrappersimple.sh 
Script: starting program
C++ will now cause a SIGSEGV
Trap result code 0
./wrapper.sh: line 8: 26368 Segmentation fault      (core dumped) ./sigsegv
Script: result code from program was 139

Ключевая часть была Trap result code 0, Вот где я ожидал, что он скажет 139, чтобы указать SIGSEGV (что составляет 128 базовых значений + 11 для SIGSEGV).

В случае, если это имеет значение, RHEL 6.2, bash 4.1.2(1)-релиз.

1 ответ

Решение

Я не уверен, но я думаю, что оболочка еще не обновила значение $? в то время обработчик для CHLD называется. Рассмотрим этот скрипт:

set -bm

trap 'echo "Trap result code $?"' CHLD

echo "Script: starting program"
(exit 9)
(exit 11)
echo "Script: result code from program was $?"

Я заменяю вашу программу на C++ простой подоболочкой, которая имитирует ошибку сегмента. Когда я запускаю его, CHLD trap печатает "Код результата ловушки 9", указывая, что ловушка видит состояние выхода команды до той, которая запускает ловушку. Изменение значения первого вызова subshell на exit изменяет значение, напечатанное ловушкой.


Вопрос, который вы связываете с ловушками EXIT псевдо-сигнал. Без погружения в bash Исходный код, я подозреваю, что происходит так:

  1. Установить ловушку для CHLD

  2. Для каждой команды:

    а. Команда запуска

    б. Выполнить ловушку для полученного сигнала

    с. Задавать $?

  3. казнить EXIT ловушка, если есть

  4. Выход

На шаге 2b значение $? соответствующая команда в 2а пока недоступна. На шаге 3 значение $? Связанный со сценарием доступен, потому что он совпадает со значением из 2c, из последней команды, выполненной в сценарии.

Другие вопросы по тегам