2013-04-01 46 views
1

我想在我的C代碼中使用posix函數isatty()來判斷輸出是否被重定向。然而,爲此,我需要一個文件描述符,並且從我的研究中看,fileno()不再包含在stdio.h中。是否有任何其他方法獲取文件描述符?fileno()不可用?

回答

3

如果你只是想知道,如果輸出被重定向,您可以使用:

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

STDOUT_FILENO一般1

+0

我不知道的是那。這對我正在嘗試做的更好 – kennycoc

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),我只需要重新編譯,而不是編輯每個源文件。

+0

謝謝你,我忘了啓用Posix擴展 – kennycoc

2

它仍然存在,但您可能必須明確打開POSIX功能。特別是,在Linux下,只有在啓用了POSIX或XOPEN功能的情況下,纔可以使用fileno。從fileno(3)手冊頁:

功能測試的glibc的宏要求(見feature_test_macros(7)):

fileno(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE 

因此,編譯-D_POSIX_SOURCE

相關問題