Có phải thông báo `Segment error` nằm dưới STDERR không?


17

Tôi đã chạy một thực thi trong bash

./code > log

Nó hiển thị các thông báo lỗi không thường xuyên trên thiết bị đầu cuối trong khi tất cả các câu lệnh printf đi vào tệp nhật ký. Tôi chạy lại nó như dưới đây

./code >& log

Bây giờ, các thông báo lỗi thỉnh thoảng cũng đi vào nhật ký. Nhưng nếu có lỗi phân đoạn, nó vẫn được hiển thị trên thiết bị đầu cuối. Tại sao? Làm thế nào để làm cho thông điệp Segmentation fault (core dumped)đi vào tệp nhật ký?


người dùng $ bash --version

GNU bash, phiên bản 4.2.24 (1) -release (i686-pc-linux-gnu)

Câu trả lời:


14

Lỗi phân đoạn là một tín hiệu, nếu bạn không nắm bắt được điều này thì chương trình của bạn sẽ bị chấm dứt và trình bao của bạn sẽ in nó ra stderr của nó (chứ không phải là stderr của chương trình).

Chương trình hoặc trình bao của bạn có thể thực hiện các hành động cụ thể khi điều này xảy ra, bằng cách chương trình bắt tín hiệu hoặc trình bao của bạn bẫy tín hiệu SIGCHILD và sau đó kiểm tra trạng thái thoát của con bạn.


1
@ user13107help trap
Carlos Campderrós

2
vâng hiểu rồi. nếu có ai quan tâm, đây là những gì tôi đã làm pastebin.com/QyeJYYHC
user13107

1
Lệnh shell trapbẫy các tín hiệu được gửi đến shell . Vì vậy, nó sẽ không hoạt động để bắt một người được gửi đến chương trình của bạn.
derobert

1
@ warl0ck có thể bắt một segfault giống như cách bạn bắt được bất kỳ tín hiệu nào, tuy nhiên điều này có thể dẫn đến hành vi không xác định, nhưng nếu bạn biết bạn đang làm gì thì bạn có thể ít nhất có thể chết theo cách hợp lý. OP muốn in lên stderr, trong trường hợp này bắt segfault và in là an toàn.
cjh

1
@ warl0ck: bạn có thể, đó chỉ là một ý tưởng rất tồi để làm bất cứ điều gì trong trình xử lý nhưng đăng nhập và thoát. Có một số trường hợp sử dụng chuyên ngành mặc dù.
Linuxios

19

Thông báo lỗi phân đoạn của Tin nhắn được in thành stderr, nhưng đó là lỗi tiêu chuẩn của shell chứ không phải lỗi tiêu chuẩn của chương trình. Shell in thông báo này khi phát hiện chương trình đã kết thúc do tín hiệu.

Bạn có thể tắt tiếng tin nhắn bằng cách chuyển hướng stderr xung quanh một phần của tập lệnh shell chạy chương trình:

{ ./code; } >&log
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.