如何将 C 程序的输出从 /dev/tty 重定向到 /dev/null?

Fir*_*tin 9 shell c io-redirection tty controlling-terminal

考虑这个示例 C 程序,它写入/dev/tty并且没有命令行选项使其不这样做。

#include <stdio.h>

int main (void) {
    FILE* fout = fopen("/dev/tty", "w");
    fprintf(fout, "Hello, World!\n");
    fclose(fout);
}
Run Code Online (Sandbox Code Playgroud)

如何将它的输出重定向到/dev/nullshell 脚本中?

PS我读了这个答案,但我不太明白。无论如何,我希望得到一个不会修改程序代码源的答案。

Gil*_*il' 16

TL,博士:

script -c myprogram /dev/null </dev/null >/dev/null
Run Code Online (Sandbox Code Playgroud)

您不能像/dev/tty重定向标准输出那样“重定向” 。标准输出被定义为文件描述符。程序在启动时写入文件描述符 1 上已经打开的任何文件。某些操作系统提供/dev/stdout的文件相当于标准输出,但它是标准输出的“别名”。相反,/dev/tty是一个文件名,它指的是进程的控制终端。如果程序打开/dev/tty,则明确地打开/dev/tty,并且无法重定向。

您可以做的是使用与运行它的程序的控制终端不同的控制终端来运行该程序。一个简单的方法是使用script命令. 以其最简单的形式:

script -c myprogram /dev/null >/dev/null
Run Code Online (Sandbox Code Playgroud)

myprogram运行并打开时/dev/tty,这是由 提供script的终端,而不是script运行的终端。什么script当它检测到终端上写是写都以自己的标准输出,并写入到指定的打字稿文件执行; 因此我将script的标准输出和打字稿文件都设置为/dev/null.

如果myprogram从终端script读取,则从它自己的标准输入读取,因此您可能也希望将其重定向到/dev/null

请注意,script不会将 的退出状态传递myprogram给其调用者。某些实现(例如 Debian 和衍生版本中的实现)可以-e选择这样做。