“ Segmentation fault”消息是否出现在STDERR下?


17

我在其中运行了一个可执行文件 bash

./code > log

它在终端上偶尔显示错误消息,而所有printf语句都进入日志文件。我像下面一样重新运行

./code >& log

现在,偶尔的错误消息也将记录到日志中。但是,如果存在分段错误,它仍会显示在终端上。为什么?如何使消息Segmentation fault (core dumped)进入日志文件?


用户$ bash --version

GNU bash版本4.2.24(1)-发行版(i686-pc-linux-gnu)

Answers:


14

分段错误是一个信号,如果您没有捕获到该错误,则您的程序将终止,并且您的外壳程序会将其打印到其stderr(而不是程序的stderr)。

当程序或外壳程序捕获信号或外壳程序捕获SIGCHILD信号然后检查孩子的退出状态时,程序或外壳程序可能会采取特定的措施。


1
@ user13107help trap
卡洛斯·

2
对。得到它了。如果有人有兴趣,这就是我的操作pastebin.com/QyeJYYHC
user13107 2012年

1
shell trap命令捕获发送到shell的信号。因此,赶上正在发送到您程序中的那个是行不通的。
derobert

1
@ warl0ck可能会以捕获任何信号的相同方式捕获段错误,但这可能导致不确定的行为,但是如果您知道自己在做什么,则至少可以以明智的方式死亡。OP希望打印到stderr,在这种情况下,可以捕获段错误,并且打印是安全的。
cjh 2012年

1
@ warl0ck:您可以,在处理程序中执行任何操作,但登录并退出只是一个非常糟糕的主意。虽然有一些专门的用例。
Linuxios

19

“ segmentation fault”消息已打印到stderr,但这是外壳程序的标准错误,而不是程序的标准错误。当外壳程序检测到由于信号终止程序时,它将打印此消息。

您可以通过将stderr重定向到运行该程序的Shell脚本部分来使消息静音:

{ ./code; } >&log
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.