我想在我的C代碼中使用posix函數isatty()
來判斷輸出是否被重定向。然而,爲此,我需要一個文件描述符,並且從我的研究中看,fileno()
不再包含在stdio.h
中。是否有任何其他方法獲取文件描述符?fileno()不可用?
1
A
回答
3
如果你只是想知道,如果輸出被重定向,您可以使用:
#include <unistd.h>
...
if (isatty(STDOUT_FILENO))
error("redirect output.");
STDOUT_FILENO
一般1
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
。
相關問題
- 1. 爲什麼:: feof()與:: _ eof(:: fileno())不同?
- 2. 在課堂上創建fileno?
- 3. fileno和引用弱化混淆
- 4. fileno轉換FILE描述符C
- 5. 模仿fileno()的行爲並選擇
- 6. fileno()和大於2GB的文件
- 7. 「NoneType」對象有沒有屬性「的fileno」
- 8. Django文件上傳 - fileno錯誤
- 9. 如何控制fileno的輸出?
- 10. 的fileno,F_LOCK和F_ULOCK成爲未申報的和不可用時,我想補充性病= C99的國旗與gcc
- 11. fileno()可以返回文件包裝對象而不是實際文件的句柄嗎?
- 12. 緩衝子輸出到文件:io.UnsupportedOperation:的fileno
- 13. Python的AttributeError的:「NoneType」對象有沒有屬性「的fileno」
- 14. fileno perldoc中的這行代表什麼意思?
- 15. dup(fileno(stdin)),然後產生32個線程 - > I/O錯誤
- 16. 流入TextIOWrapper的BytesIO對象沒有fileno屬性。
- 17. 爲什麼fileno無法返回有效的描述符?
- 18. 使用文件名獲取當前pid打開的文件的fileno()?
- 19. g3d.utils不可(不再)可用?
- 20. 類型錯誤參數必須是int或擁有的fileno()方法
- 21. 爲什麼Fabric會拋出'TypeError:參數必須是int,或者有fileno()方法'?
- 22. 來自fileno和服務器實例的唯一數字連接ID
- 23. android.provider.Telephony.SMS_RECEIVED不可用
- 24. GcmListenerService不可用
- 25. stringByAppendingPathCompnent不可用
- 26. GL_CLAMP_TO_EDGE不可用
- 27. framebuffer不可用
- 28. Webservice不可用
- 29. servlet不可用
- 30. Thor不可用
我不知道的是那。這對我正在嘗試做的更好 – kennycoc