Tty

當 stderr 不引用終端設備時,為什麼 fprintf(stderr, ….) 可以輸出到螢幕?

  • March 11, 2022

鑑於一個簡單的程序:

/* 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);
}

將其編譯為initttyname並呼叫它,結果如下:

Inappropriate ioctl for device

這意味著錯誤程式碼是ENOTTY
為什麼 fprintf(stderr, ….) 在stderr不引用終端設備時可以輸出到螢幕?

如果您正在呼叫它,init那麼您不會將輸出輸出到螢幕上;輸出被發送到核心,核心將其列印到螢幕上。 init是一個特殊的過程

您可以將其視為類似於以下 shell 腳本:

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

這是通過/dev/console設備完成的;用於 init 程序的 stdin/stdout/stderr 由核心附加到此。對該設備的寫入由核心處理並發送到目前控制台設備,該設備可能是目前的 vty 或串列埠或其他地方。

引用自:https://unix.stackexchange.com/questions/693950