我如何确定什么是标准值;要点;要在C中吗?

我如何确定什么是标准值;要点;要在C中吗?,c,posix,stdout,C,Posix,Stdout,我想知道什么时候我的程序的标准输出被重定向到一个文件/设备,什么时候在屏幕上正常打印。如何在C语言中实现这一点 更新1:从评论来看,它似乎与系统有关。如果是这样,那么如何使用符合posix的系统来实现这一点 您可能想查看以下内容: 我引用链接中的话: freopen Reopen stream with different file or mode freopen first tries to close any file already associated with the stream

我想知道什么时候我的程序的标准输出被重定向到一个文件/设备,什么时候在屏幕上正常打印。如何在C语言中实现这一点


更新1:从评论来看,它似乎与系统有关。如果是这样,那么如何使用符合posix的系统来实现这一点

您可能想查看以下内容:

我引用链接中的话:

freopen

Reopen stream with different file or mode
freopen first tries to close any file already associated with the stream given as third parameter and disassociates it.
Then, whether that stream was successfuly closed or not, freopen opens the file whose name is passed in the first parameter, filename, and associates it with the specified stream just as fopen would do using the mode value specified as the second parameter.
This function is specially useful for redirecting predefined streams like stdin, stdout and stderr to specific files.
虽然我不确定这是否能帮你找到它首先指向的是什么。

也许
isatty(stdout)


编辑:正如罗兰和特里皮所建议的那样,更好的答案应该是
isatty(STDOUT\u FILENO)

我恐怕你不能,至少以独立于平台的方式使用标准C。标准输入/输出背后的理念是C将在标准位置执行其IO。这个标准位置可以是一个终端、一个文件或其他任何东西,这不是C语言所考虑的。因此,您无法检测当前使用的标准IO是什么


编辑:如果平台特定的解决方案适合您,请参考其他答案(并相应地编辑问题)

查找
isatty
和更一般的
fileno

如果Linux特定的解决方案正常,您可以检查进程的
/proc
目录下的符号链接。例如:

$ exec 3>/dev/null
$ ls -l /proc/$$/fd
total 0
lrwx------ 1 root root 64 Sep 12 03:28 0 -> /dev/pts/1
lrwx------ 1 root root 64 Sep 12 03:29 1 -> /dev/pts/1
lrwx------ 1 root root 64 Sep 12 03:29 2 -> /dev/pts/1
lrwx------ 1 root root 64 Sep 12 03:29 255 -> /dev/pts/1
l-wx------ 1 root root 64 Sep 12 03:29 3 -> /dev/null

据我所知,你不能,它是由内核来处理的。但是如果你编写通用工具,请不要像40年前的
ls
那样,在这种情况下使用任何魔法。有关详细信息,请阅读Rob Pike的《Unix环境中的程序设计》。@Roland Illig:这有一个有用的用例,IMHO:默认情况下,连接到TTY时进行彩色输出,但连接到文件时不输出转义序列。当然,还应该提供命令行开关来强制打开和关闭颜色。此方法仅限于类似POSIX的实现。
\u isatty()
,带前导下划线,是ISO C。@Joseph:绝对不是。ISO C没有“tty”的概念,更不用说这样的函数了。另外,
isatty(1)
也可以正常工作(
STDOUT\u FILENO
定义为1,所有shell程序员都很清楚)。@Steve,@R.:你是对的;我的评论是错误的。我被MSDN
isatty误导了。。。此POSIX函数已弃用。使用ISOC++一致性IsATTY。这是如何告诉你是否连接到TTY的?这也是平台特定的,而不是C++标准的一部分。如果我错了,请纠正我。@Peter Lawrey,意思上有区别吗?我很困惑。我假设“请让我更正”是另一种语言中表达式的翻译(在谷歌上,它大约有60K个匹配项,所以在某些地方它一定相当常见)“请更正我”是更广泛使用的表达式,在谷歌上大约有13700K个匹配项。@taskinoor,可能不是字面意义上的,“但这不是英语中的一个习语。”彼得·劳瑞和和蔼可亲的克拉克·康特,非常感谢。从现在起,我将使用“请纠正我”:-。