isatty()
出力がリダイレクトされているかどうかを確認するために、C コードでposix 関数を使用しようとしています。ただし、これを行うにはファイル記述子が必要であり、私の調査によるとfileno()
、stdio.h
. ファイル記述子を取得する別の方法はありますか?
4449 次
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_SOURCE
600 に設定すると 700 よりも優れています。より多くのマシン タイプでそのまま使用できます。700 を使用できる場合があります。これをファイルに保存posixver.h
し、コードを開始します。
#include "posixver.h"
システムヘッダーの前。これにより、ルール (たとえば 600 から 700 へ) を一元的に変更でき、すべてのソース ファイルを編集する必要はなく、再コンパイルするだけで済みます。
于 2013-04-01T18:28:19.350 に答える