gethostname以静默方式截断结果,而不是给出Enametolong错误 #包括 #包括 int main(int argc,char*argv[]){ char-buf[4]; int err=gethostname(buf,4); printf(“名称:%s n:%d\n”,buf,err);//错误:err应该是-1,errno应该给出enametolong 返回0; }
在OSX上,这将提供:gethostname以静默方式截断结果,而不是给出Enametolong错误 #包括 #包括 int main(int argc,char*argv[]){ char-buf[4]; int err=gethostname(buf,4); printf(“名称:%s n:%d\n”,buf,err);//错误:err应该是-1,errno应该给出enametolong 返回0; },c,macos,C,Macos,在OSX上,这将提供: name:xyz n:0 即使我的主机名大于3;相反,我希望err为-1,errno为enametolong 请注意,如果用户没有意识到此错误,并且在缓冲区太短时预期err为-1(文档称,如果缓冲区太短,\0不会写入缓冲区),则这也会导致缓冲区溢出错误,因此,即使err==0,上面的printf也是不可靠的。我在调查时观察到了这一点 那是虫子吗?如果是,报告在哪里?macOS手册上说: 错误 这些调用可能返回以下错误: … [enametolong]当前主机名比namel
name:xyz n:0
即使我的主机名大于3;相反,我希望err为-1,errno为enametolong
请注意,如果用户没有意识到此错误,并且在缓冲区太短时预期err为-1(文档称,如果缓冲区太短,\0
不会写入缓冲区),则这也会导致缓冲区溢出错误,因此,即使err==0,上面的printf也是不可靠的。我在调查时观察到了这一点
那是虫子吗?如果是,报告在哪里?macOS手册上说:
错误这些调用可能返回以下错误:
…
[enametolong]
当前主机名比namelen长。(仅适用于gethostname()
它还记录了:
主机名的长度限制为{sysconf(\u SC\u Host\u NAME\u MAX)
}个字符,不包括尾随的null,目前为255个字符
手册还提到了{u POSIX\u HOST\u NAME\u MAX}
另请参见POSIX规范,其中说明:
gethostname()
函数应返回当前机器的标准主机名。namelen
参数应指定name参数指向的数组的大小。返回的名称应以null结尾,但如果namelen
的长度不足以容纳主机名,则返回的名称应被截断,并且未指定返回的名称是否以null结尾
主机名限制为{Host\u NAME\u MAX}
字节
主机名限制为{Host\u NAME\u MAX}字节
您应该采取措施避免使用太短的字符串,而使用是这样做的一种方法
由于POSIX没有指定任何错误,因此不清楚您是否有要报告的错误,尽管我同意手册页暗示您应该得到
enametolong
错误。您误解了gethostname
函数的规范。再读一遍,你怎么解释<代码>[EnameTolong]当前主机名比namelen长。(仅适用于gethostname())您的意思是什么?我没有看到与文档相矛盾的消息。我的主机名长度为23;我正在传递namelen=4
,它是<23,因此我希望API失败(err=-1),errno设置为ENAMETOOLONG;相反,我得到了err=0。我在这里误解了什么?可能是文档错误。动物的行为是不同的。我不明白这是如何解释我所观察到的行为的;它所说的就是最大可能的主机名长度是sysconf(_SC_host_name_MAX);手册页指出,如果当前主机名比namelen长,则API应给出ENAMETOOLONG,在我的示例中就是这样(namelen=4,但我的主机名长度>10),但API调用给出err=0。调用返回0,因为主机名实际已找到。C不能握住你的手,所以你必须保证缓冲区大小等