2

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

#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)

通常,程序输出到stderror stdout,所以我预计以下不会产生输出。

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

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

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

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

4

1 回答 1

2

由于它不是标准错误或标准输出,因此只剩下一个选项:控制 tty。

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

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


最简单的方法expect是使用包含的 helper unbuffer,它将有效地将此内容重定向到 stdout:

$ sh -c 'echo hello >/dev/tty' >/dev/null 2>&1
hello
$ unbuffer sh -c 'echo hello >/dev/tty' >/dev/null 2>&1
$
于 2015-05-01T00:36:52.563 回答