【发布时间】:2015-09-11 08:33:36
【问题描述】:
为什么 oldolduname 和 uname 有区别?
我一直在阅读手册页,但我不明白其中的微妙之处。
【问题讨论】:
标签: c linux-kernel system-calls
为什么 oldolduname 和 uname 有区别?
我一直在阅读手册页,但我不明白其中的微妙之处。
【问题讨论】:
标签: c linux-kernel system-calls
首先,如果你从用户空间调用uname,你不需要关心区别,应该不需要使用olduname或oldolduname。在用户空间中,您使用 struct utsname 并调用 uname() 函数。
来自手册页:
随着时间的推移,utsname 结构大小的增加导致 uname() 的三个连续版本: sys_olduname() (slot __NR_oldolduname)、sys_uname()(插槽 __NR_olduname)和 sys_newuname()(插槽 __NR_uname)。第一个使用长度 9 字段;第二个使用 65;第三个也使用 65 但添加了 域名字段。 glibc uname() 包装函数隐藏了这些 来自应用程序的详细信息,调用最新版本的 内核提供的系统调用。
所以,纵观历史,struct utsname 的大小和内容略有变化,内核保留了 3 个不同的版本以保持与用户空间的兼容性,您可以在此处查看内核处理的不同版本:http://lxr.free-electrons.com/source/include/linux/utsname.h?v=2.6.38#L24。但是 glibc 或 linux 上的任何 C 库都会对您隐藏所有这些。
【讨论】:
uname是用户代码调用的函数。
它调用内核函数sys_newuname、sys_uname 或sys_olduname 之一,具体取决于Linux 内核的版本。它们之间的区别在于名称字段的长度(sys_olduname 中的 9 个字符,其他两个中的 65 个字符),sys_newuname 在结构中添加了一个额外的 domainname 字段。
【讨论】: