sethostname系统调用
名称:
gethostname,sethostname - 获取/设置主机名
概要:
#include <unistd.h>
int gethostname(char *name, size_t len);
int sethostname(const char *name, size_t len);
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
gethostname():
Since glibc 2.12: _BSD_SOURCE || _XOPEN_SOURCE >= 500
|| /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200112L
sethostname():
_BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500)
描述:
这些系统调用用于访问或更改当前处理器的主机名。
sethostname()将主机名设置为字符数组名称中给定的值。len参数指定了名字中的字节数。(因此,名称不需要终止空字节。)
gethostname()返回字符数组名称中的以NULL结尾的主机名,其长度为len个字节。如果以null结尾的主机名太大而不适合,则名称将被截断,并且不会返回错误(但请参阅下面的NOTES)。POSIX.1说,如果发生这样的截断,那么返回的缓冲区是否包含终止的空字节是未指定的。
返回值:
成功时返回零。 出错时,返回-1,并适当地设置errno。
错误值:
EFAULT 名称是无效的地址。
EINVAL len是负数,或者对于sethostname(),len大于最大允许的大小。
ENAMETOOLONG (glibc gethostname())len小于实际大小。 (在版本2.1之前,glibc在这种情况下使用EINVAL。)
EPERM 对于sethostname(),调用方不具有CAP_SYS_ADMIN功能。
遵守:
SVr4,4.4BSD(这些接口最初出现在4.2BSD中)。POSIX.1-2001和POSIX.1-2008指定了gethostname()而不是sethostname()。
注意:
SUSv2保证“主机名被限制为255个字节”。POSIX.1保证“主机名(不包括终止空字节)限于HOST_NAME_MAX字节”。在Linux上,HOST_NAME_MAX被定义为值64,自从Linux 1.0(早期的内核强加了8个字节的限制)以来这已经是限制了。
C库/内核差异
GNU C库不使用gethostname()系统调用;相反,它将gethostname()作为一个库函数实现,该函数调用uname(2)并将从返回的nodename字段中的len个字节复制到名称中。执行完副本之后,函数会检查nodename的长度是否大于或等于len,如果是,则函数返回-1,并将errno设置为ENAMETOOLONG;在这种情况下,返回的名称中不包含终止空字节。
2.2之前的glibc版本处理的情况下,nodename的长度大于或等于len不同:没有任何内容被复制到名称中,函数返回-1,并将errno设置为ENAMETOOLONG。
查看:
getdomainname(2), setdomainname(2), uname(2)
事例:
include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
char buf[256];
if(-1==gethostname(buf,256))
printf("gethostname bad \n");
return -1;
printf("name = %s\n",buf);
buf[0]=0;
strcat(buf,"hello welcome");
if(-1==sethostname(buf,strlen(buf)))
printf("sethostname bad \n");
return -1;
if(-1==gethostname(buf,256))
printf("gethostname bad \n");