'세그먼트 오류'메시지가 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를 잡을 수 있지만, 이것은 정의되지 않은 동작을 유발할 수 있지만, 무엇을하고 있는지 알면 적어도 현명한 방법으로 죽을 수 있습니다. OP는 stderr에 인쇄하고 싶었습니다.이 경우 segfault를 잡아서 인쇄하는 것이 안전합니다.
cjh

1
@ warl0ck : 처리기에서 아무것도하지 않고 로그하고 종료하는 것은 매우 나쁜 생각입니다. 그래도 특수한 사용 사례가 있습니다.
Linuxios

19

"세그먼트 결함"메시지는 stderr에 인쇄되지만 프로그램의 표준 오류가 아니라 쉘의 표준 오류입니다. 쉘은 신호로 인해 프로그램이 종료되었음을 감지하면이 메시지를 인쇄합니다.

프로그램을 실행하는 쉘 스크립트 부분에서 stderr를 경로 재지 정하여 메시지를 침묵시킬 수 있습니다.

{ ./code; } >&log
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.