我试图isatty()
在我的 C 代码中使用 posix 函数来判断输出是否被重定向。但是,要做到这一点,我需要一个文件描述符,从我的研究来看,它似乎fileno()
不再包含在stdio.h
. 有没有其他获取文件描述符的方法?
问问题
4449 次
3 回答
3
fileno()
仍然是获取与文件流关联的文件描述符的 POSIX 标准方法。
您在哪个平台上使用哪些编译选项?您是否启用了 POSIX 扩展?
gcc -std=gnu99 ...
这应该是fileno()
可见的。(使用gcc -std=c99 -pedantic
可能会使它们不可见。)
或者,将此节的变体添加到您的代码中,或将其放在标题中并将其包含在代码的开头:
#ifndef JLSS_ID_POSIXVER_H
#define JLSS_ID_POSIXVER_H
/*
** Include this file before including system headers. By default, with
** C99 support from the compiler, it requests POSIX 2001 support. With
** C89 support only, it requests POSIX 1997 support. Override the
** default behaviour by setting either _XOPEN_SOURCE or _POSIX_C_SOURCE.
*/
/* _XOPEN_SOURCE 700 is loosely equivalent to _POSIX_C_SOURCE 200809L */
/* _XOPEN_SOURCE 600 is loosely equivalent to _POSIX_C_SOURCE 200112L */
/* _XOPEN_SOURCE 500 is loosely equivalent to _POSIX_C_SOURCE 199506L */
#if !defined(_XOPEN_SOURCE) && !defined(_POSIX_C_SOURCE)
#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600 /* SUS v3, POSIX 1003.1 2004 (POSIX 2001 + Corrigenda) */
#else
#define _XOPEN_SOURCE 500 /* SUS v2, POSIX 1003.1 1997 */
#endif /* __STDC_VERSION__ */
#endif /* !_XOPEN_SOURCE && !_POSIX_C_SOURCE */
#endif /* JLSS_ID_POSIXVER_H */
就我而言,_XOPEN_SOURCE
设置为 600 比 700 好;它可以在更多机器类型上开箱即用。您也许可以使用 700。我将其保存在一个文件中posixver.h
,然后我的代码开始
#include "posixver.h"
在任何系统标题之前。这允许我集中更改规则(例如 600 到 700),我只需要重新编译,而不是编辑每个源文件。
于 2013-04-01T18:28:19.350 回答
3
它仍然存在,但您可能必须显式打开 POSIX 功能。特别是在 Linux 下,fileno
仅当启用 POSIX 或 XOPEN 功能时才可用。从fileno(3)
手册页:
glibc 的功能测试宏要求(参见 feature_test_macros(7)):
fileno(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
所以,用-D_POSIX_SOURCE
.
于 2013-04-01T18:31:18.050 回答
3
如果您只想知道输出是否被重定向,您可以使用:
#include <unistd.h>
...
if (isatty(STDOUT_FILENO))
error("redirect output.");
STDOUT_FILENO
一般为1。
于 2013-04-01T19:11:23.230 回答