Tty
當 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); }
將其編譯為init
ttyname
並呼叫它,結果如下: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 或串列埠或其他地方。