fileno()不可用?

时间:2013-04-01 18:23:37

标签: c gcc posix c99

我正在尝试在我的C代码中使用posix函数isatty()来判断输出是否被重定向。但是,要做到这一点,我需要一个文件描述符,从我的研究看来fileno()不再包含stdio.h。有没有其他方法来获取文件描述符?

3 个答案:

答案 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。