R..*_*R.. 21 c linux posix standards-compliance
Linux和GNU用户空间(glibc)似乎都有一些"WONTFIX"错误,即责任方已声明他们不愿意修复的错误,尽管明显违反了ISO C和/或POSIX的要求,但我不知道程序员的任何资源,列出了这些错误和解决它们的建议.
以下是一些想到的:
select错误:( select和相关接口)标记UDP套接字文件描述符,一旦收到数据包就准备好读取,而不确认校验和.在后续recv/ read/ etc.,如果校验和无效,则调用将阻塞.解决此问题需要始终将UDP套接字设置为非阻塞模式并处理该EWOULDBLOCK情况.如果我没记错的话,MaraDNS是第一个受这个bug影响的着名项目,也是第一个抱怨(不成功)修复它的项目.注意:正如Martinv.Löwis所指出的,显然这个bug已被修复.如果您需要支持真正过时的Linux版本,可能只需要解决方法.printf,GNU C库中的族错误地将参数%s视为多字节字符串而不是字节字符串%.3s,从而可能导致截断输出.我知道除了替换整个printf子系统之外没有解决方法(或者根本不使用printf具有非多字节字符字符串的函数系列,但如果你想snprintf在UTF-8语言环境中使用while 处理遗留代码页字符串,这可能会有问题).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;
}
Run Code Online (Sandbox Code Playgroud)
在de_DE.UTF-8语言环境中打印"Löw",它看起来对我来说:我要求4个字节,并得到4个字节(ö是2个字节).如果库计算了多字节字符,则输出应为"Löwi".这是glibc 2.11.2.
编辑:将字符串更改为"%.2s \n"将只打印"L",即只有一个字节.但是,这符合规范,即说明
如果指定了精度,则不会超过很多字节将被写入.
(强调我的),然后
在任何情况下都不得写出部分字符.
因此,由于打印两个字节(即L和ö的前导字节)将导致写入部分字符,因此将不符合打印不完整的UTF-8.
| 归档时间: |
|
| 查看次数: |
1409 次 |
| 最近记录: |