当我在命令行上运行uname -a
时,我得到以下输出:
5.10.63-v7l+ #1459 SMP Wed Oct 6:41:57英国夏令2021 armv7l GNU/Linux
这是由-a
参数实现的,它相当于使用这些参数(有6) -snrvmo
。
我试图使用C中的uname()
syscall来复制它,命令页对返回的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
选项的操作系统字符串。无名--救命显示有一个-o
参数来显示操作系统,这在uname()
syscall返回的结构中似乎不可用。
-o, --operating-system
print the operating system
所以,我能做的最好的事情就是使用syscall获取以下信息,注意到"GNU/Linux“并不像uname -a
给出的那样。
5.10.63-v7l+ #1459 SMP Wed Oct 6 16:41:57 BST 2021 armv7l
我是否可以像使用uname -o
**?**那样在C程序中获得操作系统名称(在本例中是“/Linux”)
发布于 2021-10-20 08:56:40
您可以在这里读取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")?
由于一个编译后的软件只能由一个操作系统使用,所以您可以想象在构建时设置它。
https://stackoverflow.com/questions/69640161
复制相似问题