uname Syscall 缺少操作系统字符串存在于 uname -a 输出中
Posted
技术标签:
【中文标题】uname Syscall 缺少操作系统字符串存在于 uname -a 输出中【英文标题】:uname Syscall Missing Operating System String Present in uname -a Output 【发布时间】:2021-12-06 22:20:29 【问题描述】:当我在命令行上运行uname -a
时,我得到以下输出:
Linux raspberrypi 5.10.63-v7l+ #1459 SMP Wed Oct 6 16:41:57 BST 2021 armv7l GNU/Linux
这是通过-a
参数实现的,相当于使用这些参数(有6个)-snrvmo
。
我正在尝试使用 C 中的 uname()
系统调用来复制它。manpage 对我返回的 uname()
结构表示以下内容:
DESCRIPTION
uname() returns system information in the structure pointed to by buf. The utsname struct is de‐
fined in <sys/utsname.h>:
struct utsname
char sysname[]; /* Operating system name (e.g., "Linux") */
char nodename[]; /* Name within "some implementation-defined
network" */
char release[]; /* Operating system release (e.g., "2.6.28") */
char version[]; /* Operating system version */
char machine[]; /* Hardware identifier */
#ifdef _GNU_SOURCE
char domainname[]; /* NIS or YP domain name */
#endif
;
您会注意到没有与命令行uname -o
选项对应的操作系统字符串。 uname --help 显示有一个 -o
参数来显示操作系统,并且在 uname()
系统调用返回的结构中似乎不可用。
-o, --operating-system
print the operating system
所以我似乎能做的最好的事情是使用系统调用获取以下信息,指出“GNU/Linux”并不像uname -a
给出的那样结束:
Linux raspberrypi 5.10.63-v7l+ #1459 SMP Wed Oct 6 16:41:57 BST 2021 armv7l
有没有办法像使用 uname -o
一样在我的 C 程序中获取操作系统名称(在本例中为“GNU/Linux”)?My source code is essentially this
【问题讨论】:
【参考方案1】:您可以在此处阅读uname
代码:https://github.com/MaiZure/coreutils-8.3/blob/master/src/uname.c
在那段代码中,写着:
if (toprint
& (PRINT_KERNEL_NAME | PRINT_NODENAME | PRINT_KERNEL_RELEASE
| PRINT_KERNEL_VERSION | PRINT_MACHINE))
struct utsname name;
if (uname (&name) == -1)
die (EXIT_FAILURE, errno, _("cannot get system name"));
if (toprint & PRINT_KERNEL_NAME)
print_element (name.sysname);
if (toprint & PRINT_NODENAME)
print_element (name.nodename);
if (toprint & PRINT_KERNEL_RELEASE)
print_element (name.release);
if (toprint & PRINT_KERNEL_VERSION)
print_element (name.version);
if (toprint & PRINT_MACHINE)
print_element (name.machine);
我们可以理解为:“如果必须打印内核信息、节点或机器,请使用uname
syscall”。
操作系统稍后打印:
if (toprint & PRINT_OPERATING_SYSTEM)
print_element (HOST_OPERATING_SYSTEM);
HOST_OPERATING_SYSTEM
在gnulib
中定义
有没有办法像使用
uname -o
一样在我的 C 程序中获取操作系统名称(在本例中为“GNU/Linux”)?
由于一个编译好的软件只能被一个操作系统使用,你可以想象在构建时设置它。
【讨论】:
以上是关于uname Syscall 缺少操作系统字符串存在于 uname -a 输出中的主要内容,如果未能解决你的问题,请参考以下文章