兼顾重定向和关键信息正常输出(others terminal menu.c) - HeavyYuan/A-CD-Record-Management-System GitHub Wiki

见commit 74606b527a6ef3483021d6e92fb147b4e5a2591d

在linux下运行命令,常常会使用输出重定向,即使这样,有些关键信息仍然需要输出在屏幕上,如:和用户的交互式信息。

我们不能阻止用户在使用我们的程序时不做重定向,但是我们可以改造程序,实现即便在重定向发生时,也会输出关键必要信息到屏幕,指引客户。

具体原理:

在不做重定向时,程序的标准输出文件描述符是和Linux的终端(terminal)关联的,即打印到标准输出上的信息,都会在终端(屏幕)上显示。

重定向的动作,即是将标准输出文件描述符和其他设备关联了(通常是一个普通文本文件);所以需要有和终端关联的其他可用的文件描述符或文件流。

实现方法:

终端设备有对应的设备文件/det/tty,其总是指向当前终端或当前的登陆会话,因此可以通过open或者fopen打开设备文件/dev/tty,得到一个文件描述符或者文件流描述符,来关联终端。

读写各打开一次。

检测是否被重定向

系统调用isatty(int fd);可以用来检测fd是否有关联到终端,如果是返回1,否则返回0