很难说出这里问的是什么。这个问题是模棱两可的、含糊的、不完整的、过于宽泛或修辞的,不能以目前的形式得到合理的回答。如需帮助澄清此问题以便可以重新打开,visit the help center .
11 年前关闭。
Linux 和 GNU 用户空间 (glibc) 似乎都有许多“WONTFIX”错误,即尽管明显违反了 ISO C 和/或 POSIX 的要求,但责任方已声明不愿意修复这些错误,但我不知道程序员的任何资源,其中列出了此类错误和解决它们的建议。
以下是一些想到的:
select
错误:select
(和相关接口(interface))标记一个 UDP 套接字文件描述符,一旦收到数据包就准备好读取,无需确认校验和。后续 recv
/read
/etc.,如果校验和无效,调用将阻塞。解决这个问题需要始终将 UDP 套接字设置为非阻塞模式并处理 EWOULDBLOCK
状况。如果我没记错的话,MaraDNS 是第一个受此错误影响的著名项目,也是第一个提示(未成功)修复它的项目。 注:正如 Martin v. Löwis 所指出的,显然这个错误已经被修复了。只有当您需要支持真正过时的 Linux 版本时,才可能需要变通方法。 printf
GNU C 库中的家族错误地对待 %s
的参数当指定字段精度(如 %.3s
)时,作为多字节字符串而不是字节字符串,可能会导致截断输出。我知道除了替换整个 printf
之外没有其他解决方法子系统(或者干脆不将 printf
系列函数用于非多字节字符的字节字符串,但是如果您想在 UTF-8 语言环境中使用 snprintf
处理遗留代码页字符串,这可能会出现问题)。 errno
某些系统调用的结果代码(不记得哪些是正确的)。如果您只是阅读 GNU/Linux 手册页并将它们与标准进行比较,通常这些很容易检查。 (我找不到这方面的引用资料,也许我弄错了。我能找到的最接近的是 ENOTSUP
和 EOPNOTSUP
具有相同值的问题;参见 PDTR 24715。我们可以添加到此列表中的更多错误和解决方法是什么?我提出这个问题的目的是:
最佳答案
我无法重现您声称的 printf 问题。运行程序
#include <stdio.h>
#include <locale.h>
int main()
{
setlocale(LC_ALL, "");
printf("%.4s\n", "Löwis");
return 0;
}
在 de_DE.UTF-8 语言环境中打印“Löw”,这对我来说是正确的:我要求 4 个字节,得到 4 个字节(ö 是 2 个字节)。如果库计算多字节字符,输出应该是“Löwi”。这是 glibc 2.11.2。
编辑 : 将字符串更改为 "%.2s\n"只会打印 "L",即只有一个字节。但是,这符合 the specification ,这说
If the precision is specified, no more than that many bytes shall be written.
(强调我的),然后
In no case shall a partial character be written.
因此,由于打印两个字节(即 L 和 ö 的前导字节)会导致写入部分字符,因此打印不完整的 UTF-8 将不符合标准。
关于c - GNU/Linux 上的 WONTFIX 错误是什么以及如何解决它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4381430/