1

isatty()出力がリダイレクトされているかどうかを確認するために、C コードでposix 関数を使用しようとしています。ただし、これを行うにはファイル記述子が必要であり、私の調査によるとfileno()stdio.h. ファイル記述子を取得する別の方法はありますか?

4

3 に答える 3

3

出力がリダイレクトされているかどうかだけを知りたい場合は、次を使用できます。

#include <unistd.h>
...
if (isatty(STDOUT_FILENO))
  error("redirect output.");

STDOUT_FILENO一般的には 1 です。

于 2013-04-01T19:11:23.230 に答える
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_SOURCE600 に設定すると 700 よりも優れています。より多くのマシン タイプでそのまま使用できます。700 を使用できる場合があります。これをファイルに保存posixver.hし、コードを開始します。

#include "posixver.h"

システムヘッダーの前。これにより、ルール (たとえば 600 から 700 へ) を一元的に変更でき、すべてのソース ファイルを編集する必要はなく、再コンパイルするだけで済みます。

于 2013-04-01T18:28:19.350 に答える