Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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; }

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

在OSX上,这将提供:
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不能握住你的手,所以你必须保证缓冲区大小等