美文网首页
gethostname的背后机制

gethostname的背后机制

作者: rockybean | 来源:发表于2016-05-25 21:14 被阅读240次

    有些应用在启动的过程中为了更友好的展示,会自动去获取当前机器的hostname,这时会调用到gethostname系统调用,通过man gethostname可以查看其详情,但其背后又是怎样一个流程呢?我们通过strace来看一下。

    先上一个简单的代码,用于获取hostname。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
    
        char hostname[1024];
        gethostname(hostname, 1024);
    
        puts(hostname);
    
        return EXIT_SUCCESS;
    }
    

    然后执行如下的命令

    gcc gethostname.c -o gethostname
    strace ./gethostname
    

    输出结果如下:

    execve("./gethostname", ["./gethostname"], [/* 23 vars */]) = 0
    brk(0)                                  = 0x25fb000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b89ec0e2000
    access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
    open("/etc/ld.so.cache", O_RDONLY)      = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=44475, ...}) = 0
    mmap(NULL, 44475, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b89ec0e3000
    close(3)                                = 0
    open("/lib64/libc.so.6", O_RDONLY)      = 3
    read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\356\241\0068\0\0\0"..., 832) = 832
    fstat(3, {st_mode=S_IFREG|0755, st_size=1926760, ...}) = 0
    ......
    uname({sys="Linux", node="yourhost", ...}) = 0
    fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b89ec0e3000
    write(1, "yourhost\n", 26yourhost
    ) = 26
    exit_group(0)
    

    其中有一条uname的系统调用,如果我们执行uname -n,可以得到当前机器的hostname。所以原理就在这里,最后,strace是个好东西。

    相关文章

      网友评论

          本文标题:gethostname的背后机制

          本文链接:https://www.haomeiwen.com/subject/zjbtdttx.html