"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)
通常,程序输出到 stderr
或 stdout
,所以我预计以下不会产生任何输出。
./Classic 2> /dev/null > /dev/null
然而,输出是完全一样的,所以我对这个场景有三个问题。
- 这里正在打印什么流?
- 我如何编写打印到这个特殊流的代码(不故意破坏我的堆栈)。
- 如何重定向此流的输出?
请注意,我 运行 在 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
$
考虑以下非常基本的程序,它已以多种形式出现在此处的其他问题上。
#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)
通常,程序输出到 stderr
或 stdout
,所以我预计以下不会产生任何输出。
./Classic 2> /dev/null > /dev/null
然而,输出是完全一样的,所以我对这个场景有三个问题。
- 这里正在打印什么流?
- 我如何编写打印到这个特殊流的代码(不故意破坏我的堆栈)。
- 如何重定向此流的输出?
请注意,我 运行 在 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
$