簡単なプログラムが与えられたら:
/* 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ポート、シリアルポート、または他の場所である可能性がある現在のコンソールデバイスに送信されます。