stderrが端末デバイスを参照していない場合、fprintf(stderr、....)が画面に出力されるのはなぜですか?

stderrが端末デバイスを参照していない場合、fprintf(stderr、....)が画面に出力されるのはなぜですか?

簡単なプログラムが与えられたら:

/* ttyname.c */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int main(int argc, char **argv)
{
  char **tty = NULL;

  tty = ttyname(fileno(stderr));
  if (tty == NULL)
    {
      fprintf(stderr, "%s\n", strerror(errno));
      exit(EXIT_FAILURE);
    }

  printf("%s\n", tty);
  
  exit(EXIT_SUCCESS);
}

次のようにコンパイルし、ttyname次のように呼び出します。内部に、結果は次のとおりです。

Inappropriate ioctl for device

これはエラーコードがあることを意味しますENOTTY。端末デバイスが関連していない場合、
fprintf(stderr、....)がstderr画面に出力されるのはなぜですか?

ベストアンサー1

initこう呼ぶといいえ出力を画面に印刷します。出力はカーネルに送られ、画面に印刷されます。 init特別なプロセスです

次のシェルスクリプトに似ていると思います。

$ x=$(ttyname 2>&1)
$ echo $x
Inappropriate ioctl for device

これは/dev/consoleデバイスを介して行われます。 initプロセスのstdin / stdout / stderrはカーネルによってここにリンクされています。このデバイスへの書き込みはカーネルによって処理され、現在のvtyポート、シリアルポート、または他の場所である可能性がある現在のコンソールデバイスに送信されます。

おすすめ記事