"stack smashing detected" 消息打印到哪个流?

Which stream does "stack smashing detected" message get printed to?

考虑以下非常基本的程序,它已以多种形式出现在此处的其他问题上。

#include <string.h>

int main() {
    char message[8];
    strcpy(message, "Hello, world!");
}

在我的系统上,如果我把它放在一个名为 Classic.c 的文件中,不使用特殊标志编译它并 运行 它,我得到以下输出。

$ gcc -o Classic Class.c 
$ ./Classic
*** stack smashing detected ***: ./Classic terminated
Aborted (core dumped)

通常,程序输出到 stderrstdout,所以我预计以下不会产生任何输出。

./Classic  2> /dev/null > /dev/null

然而,输出是完全一样的,所以我对这个场景有三个问题。

  1. 这里正在打印什么流?
  2. 我如何编写打印到这个特殊流的代码(不故意破坏我的堆栈)。
  3. 如何重定向此流的输出?

请注意,我 运行 在 Linux 系统上使用。具体来说,Ubuntu 14.04.

因为它不是 stderr 或 stdout,所以只剩下一个选项:控制 tty。

您可以通过打开 /dev/tty.

来写入您的代码

故意重定向其输出非常困难(这就是 /dev/tty 也用于密码提示的原因)。也就是说,如果您真的想这样做,expect 可以用于此目的,emPTY.

也可以。

使用 expect 最简单的方法是使用包含的帮助程序 unbuffer,这将有效地将此内容重定向到标准输出:

$ sh -c 'echo hello >/dev/tty' >/dev/null 2>&1
hello
$ unbuffer sh -c 'echo hello >/dev/tty' >/dev/null 2>&1
$