添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
sethostname系统调用

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");