1

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

4

3 回答 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 回答