gpt4 book ai didi

c - 检测 NUL 文件描述符(isatty 是假的)

转载 作者:可可西里 更新时间:2023-11-01 13:14:01 26 4
gpt4 key购买 nike

以下 C 文件在将 NUL 传递给它时会给出虚假结果:

int main()
{
printf("_isatty = %d\n", _isatty(0));
}

结果是:

C:\Users\Edward\Dev\nulltest> test.exe < NUL
_isatty = 64

我很确定 NUL(又名/dev/null)不是终端设备!所以我需要用另一种方式来检测文件描述符是否对应于NUL。该数字没有任何特定含义;当我确实连接了一个终端时,我看到了它。

我该怎么办? This question建议使用粗略的未记录函数来获取基础名称,大概将其与 NUL 进行比较,但这对我来说不太理想。有没有更好的办法?

附言这将有助于解决 this GHC bug .

最佳答案

来自 msdn :

_isatty returns a nonzero value if the descriptor is associated with a character device. Otherwise, _isatty returns 0.

NUL 就像 Unix 上的/dev/null,它是一个字符设备。

请注意,在 Linux 上,isatty 是不同的:

The isatty() function tests whether fd is an open file descriptor referring to a terminal.

您可以做的是尝试将 STDIN_FILENO (0) 与 ${cwd}/NUL 进行比较(使用 stat 或 stat)。

更新:

int ret = GetFileType(GetStdHandle(STD_INPUT_HANDLE));

它将为 NUL 或 tty 返回 FILE_TYPE_CHAR。

参见 GetFileType其他值的文档。您可以检测文件/字符设备/管道。

最终更新:

使用GetConsoleMode用于输入和 GetConsoleScreenBufferInfo用于输出。

CONSOLE_SCREEN_BUFFER_INFO sbi;
DWORD mode;
if (!GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &mode))
fprintf(stderr, "not console\n");
else
fprintf(stderr, "console\n");
if (!GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &sbi))
fprintf(stderr, "not console\n");
else
fprintf(stderr, "console\n");

关于c - 检测 NUL 文件描述符(isatty 是假的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3648711/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com