我正在尝试在我的C代码中使用posix函数isatty()
来判断输出是否被重定向。但是,要做到这一点,我需要一个文件描述符,从我的研究看来fileno()
不再包含stdio.h
。有没有其他方法来获取文件描述符?
答案 0 :(得分: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 */
就我的目的而言,设置为600的_XOPEN_SOURCE
优于700;它在更多机器类型上开箱即用。您可以使用700.我将其保存在文件posixver.h
中,我的代码开始
#include "posixver.h"
在任何系统标头之前。这允许我集中更改规则(例如600到700),我只需要重新编译,而不是编辑每个源文件。
答案 1 :(得分: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
进行编译。
答案 2 :(得分:3)
如果您只想知道输出是否被重定向,可以使用:
#include <unistd.h>
...
if (isatty(STDOUT_FILENO))
error("redirect output.");
STDOUT_FILENO
通常为1。