'세그먼트 오류'메시지가 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.