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)

通常、プログラムの出力はstderrまたはstdoutに行くので、次の場合は何も出力されないだろうと予想しました。

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

ただし、出力はまったく同じであるため、このシナリオについて 3 つの質問があります。

  1. ここに出力されているストリームは何ですか?
  2. この特別なストリームに出力するコードをどのように書くことができますか (故意にスタックを壊すことなく)。
  3. このストリームの出力をリダイレクトするにはどうすればよいですか?

Linux システムで実行していることに注意してください。具体的には、Ubuntu 14.04.

4

1 に答える 1

2

stderr や stdout ではないため、残されたオプションは 1 つだけです。制御 tty です。

を開いてコードでこれに書き込むことができます/dev/tty

出力のリダイレクトは、意図的に非常に難しくなっています (これが/dev/tty、パスワード プロンプトにも使用される理由です)。そうは言っても、本当にやりたい場合は、emPTYexpectと同様に、この目的に使用できます。


での最も簡単なアプローチexpectは、含まれている helper を使用することですunbuffer。これにより、このコンテンツが標準出力に効果的にリダイレクトされます。

$ 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 に答える