如何在C中获取mac os的主机名
我正在尝试获取学校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如何在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,
现在在上面的实现中,我使用了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 };