Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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
如何在C中获取mac os的主机名_C - Fatal编程技术网

如何在C中获取mac os的主机名

如何在C中获取mac os的主机名,c,C,我正在尝试获取学校mac os的主机名。我不能使用gethostname,因为它在我的学校Mac手册的第3部分,而不是第2部分。有没有另一种不使用gethostname获取主机名的方法?我只允许在Man2部分中使用libc函数。gethostname只是一个sysctl,sysctl只是一个syscall。 和系统调用符合本手册第2节中的定义 因此,如果您没有最喜欢的反汇编程序或otool-tV,请使用/usr/lib/system中的库,找出哪些导出了_gethostname和_sysctl,

我正在尝试获取学校mac os的主机名。我不能使用gethostname,因为它在我的学校Mac手册的第3部分,而不是第2部分。有没有另一种不使用gethostname获取主机名的方法?我只允许在Man2部分中使用libc函数。

gethostname只是一个sysctl,sysctl只是一个syscall。 和系统调用符合本手册第2节中的定义

因此,如果您没有最喜欢的反汇编程序或otool-tV,请使用/usr/lib/system中的库,找出哪些导出了_gethostname和_sysctl,然后开始工作或查找源代码:p

下面,我使用sysctl重新实现了gethostname,并使用syscall重新实现了sysctl:

namelen必须相应地设置为3


现在在上面的实现中,我使用了puts,这显然是不允许的,但我相信您可以找到如何重新实现strlen并使用write系统调用

第一:第二:为什么手册页的哪一部分很重要?为什么手册页中记录gethostname的部分出现了问题?在BSD派生的系统上,第2节只记录系统调用,而库函数在第3节?所以问问他。问我们有点像作弊,不是吗?@dhke:你可以在Linux的第2节和第3节中找到gethostname!3用于标准函数libc、POSIX,2用于平台相关的东西。编程中的一般规则:对C使用最标准的方式:C标准,然后是其他标准,然后是适用的平台。教授不同的东西比仅仅是一个坏主意更糟糕。@Olaf我真的很惊讶Linux仍然有旧的区别,但是是的,它有。和好事实上,您不应该关心函数是否包装了系统调用,或者它是否以另一种方式实现。只要它是可移植的和有文档记录的。但根据教学场景的不同,我确实看到了自己尝试实现这一点的价值,但前提是明确指出,你永远不应该为便携式代码这样做。我们不是“做我的作业”网站。给出提示就足够了,发布所有代码并不能真正帮助OP提高他的研究或编码技能。
#include <sys/syscall.h>    // SYS_sysctl
#include <sys/sysctl.h>     // CTL_KERN, KERN_HOSTNAME
#include <unistd.h>         // syscall

int sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen)
{
    return syscall(SYS_sysctl, name, namelen, oldp, oldlenp, newp, newlen);
}

int gethostname(char *buf, size_t buflen)
{
    int name[] = { CTL_KERN, KERN_HOSTNAME };
    size_t namelen = 2;

    return sysctl(name, namelen, buf, &buflen, NULL, 0);
}

int puts(const char *s)
{
    // left as an exercise to the reader ;)
}

int main(void)
{
    #define BUFSIZE 256
    char buf[BUFSIZE];
    size_t buflen = BUFSIZE;

    if(gethostname(buf, buflen) == 0)
    {
        puts(buf);
    }

    return 0;
}
int name[] = { CTL_KERN, KERN_PROCARGS, pid };