Чи надходить повідомлення про помилку сегментації під STDERR?


17

Я запустив виконуваний файл у bash

./code > log

Він показує випадкові повідомлення про помилки на терміналі, тоді як усі заяви printf переходять у файл журналу. Я повторно запускаю його, як нижче

./code >& log

Тепер випадкові повідомлення про помилки також надходять у журнал. Але якщо є помилка сегментації, вона все одно відображається на терміналі. Чому? Як змусити повідомлення Segmentation fault (core dumped)перейти у файл журналу?


user $ bash --версія

GNU bash, версія 4.2.24 (1) -випуск (i686-pc-linux-gnu)

Відповіді:


14

Помилка сегментації - це сигнал, якщо ви не зафіксували це, тоді ваша програма буде припинена, і ваша оболонка буде надрукувати це на її stderr (а не на stderr програми).

Можливо, або ваша програма, або оболонка можуть вчинити конкретні дії, коли це відбувається, або програма, яка надходить на сигнал, або ваша оболонка, яка захоплює сигнал SIGCHILD, а потім перевіряє стан виходу дитини.


1
@ user13107help trap
Carlos Campderrós

2
Так. зрозумів. якщо когось цікавить, ось що я зробив pastebin.com/QyeJYYHC
user13107

1
Команда оболонки trapвідловлює сигнали, що надсилаються до оболонки . Тож не вдасться зловити того, хто надсилається у вашу програму.
derobert

1
@ warl0ck можна зловити segfault так само, як ви вловлюєте будь-який сигнал, однак це може призвести до невизначеної поведінки, але якщо ви знаєте, що ви робите, ви зможете принаймні померти розумним чином. ОП хотіла надрукувати на stderr, в цьому випадку виловлення сегмента і друк є безпечним.
cjh

1
@ warl0ck: ви можете, це дуже погана ідея робити що-небудь у обробнику, окрім журналу та виходу. Однак є деякі спеціалізовані випадки використання.
Linuxios

19

Повідомлення «помилка сегментації» друкується на stderr, але це стандартна помилка оболонки, а не стандартна помилка програми. Оболонка роздруковує це повідомлення, коли виявляє, що програма припинилася через сигнал.

Ви можете замовкнути повідомлення, перенаправивши stderr навколо частини скрипту оболонки, яка запускає програму:

{ ./code; } >&log
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.