使用C语言获取linux系统相关信息
最近在写shell的时候,涉及到了获取环境变量参数和本地计算机相关信息,包括计算机设备名,用户名的信息,在这里简单总结一下。
获取环境变量各项参数,可以直接使用getenv函数。man中关于getenv函数的声明如下:
#include <stdlib.h>
char *getenv(const char *name);
函数中,参数name 为环境变量的名称, 如果该变量存在则会返回指向该内容的指针. 环境变量的格式为name=value。执行成功则返回指向该内容的指针, 找不到符合的环境变量名称则返回NULL。
这里我使用环境变量获取用户名称和当前目录为例,首先我们知道在环境变量中,用户名保存在“LOGNAME”中,而当前目录保存在"PWD"中,所以函数调用应该为
getenv(“LOGNAME”)
getenv(“PWD”);
所以,简单的测试程序就出来了,程序源码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> int main(int argc,char **argv)
{
char *name;
char *path; name = getenv("LOGNAME");
path = getenv("PWD"); printf("logname = %s\n",name);
printf("pwd = %s\n",path); return ;
}
测试程序没有包含错误错误,如有需要,请自行加上。在我的电脑上运行如下:
wangbo@iDina-PC:~/linuxc/tmp$ ./a.out
logname = wangbo
pwd = /home/wangbo/linuxc/tmp
但是呢,我们试着请通过环境变量获取系统设备名称,是无法获取的。原因我也不太清楚,如果知道的话,赶快告诉我吧。
不能从环境变量获取设备名,就只能从其他地方获取了。恩,这里给大家介绍一个函数,gethostname函数,可以直接获取系统设备名。
声明如下:
#include <unistd.h>
int gethostname(char *name, size_t len);
函数中,name是指向你所设置的保存设备名的字符串的指针,而len是name的大小,成功的话返回0,获取失败,返回-1,错误代码保存在errno中。
函数比较简单,这里直接给出测试代码:
#include <unistd.h>
#include <stdio.h> int main(int argc, char **argv)
{
char hostname[]; if( gethostname(hostname,sizeof(hostname)) )
{
perror("gethostname");
return ();
}
printf("localhost name:%s\n",hostname); return ;
}
在我的电脑上运行结果如下:
wangbo@iDina-PC:~/linuxc/tmp$ ./a.out
localhost name:iDina-PC
后来查询相关资料,又发现一个函数,uname,可以获取系统包括版本在内的相关信息,函数声明如下:
#include <sys/utsname.h>
int uname(struct utsname *buf);
struct utsname 是一个系统定义好的结构体,结构体定义如下:
struct utsname{
char sysname[]; /* 操作系统名称 (e.g., "Linux") */
char nodename[]; /* 当前设备在网络上的名称 (e.g,"localhost.localdomain")*/
char release[]; /* 系统发布级别(e.g., "2.6.28") */
char version[]; /* 系统发布版本 */
char machine[]; /* 当前设备硬件体系(e.g.,"i686") */
#ifdef _GNU_SOURCE
char domainname[]; /* NIS或者YP域名 */
#endif
};
函数正确返回0,错误返回-1.错误代码保存在errno中。
和上面一样,比较简单,测试代码如下:
#include <sys/utsname.h>
#include <stdio.h>
#include <stdlib.h> int main(int argc,char **argv)
{
struct utsname buf; if(uname(&buf))
{
perror("uname");
exit();
} printf("sysname:%s\n",buf.sysname);
printf("nodename:%s\n",buf.nodename);
printf("release:%s\n",buf.release);
printf("version:%s\n",buf.version);
printf("machine:%s\n",buf.machine); return ;
}
我的电脑上运行结果如下:
wangbo@iDina-PC:~/linuxc/tmp$ ./a.out
sysname:Linux
nodename:iDina-PC
release:3.13.--generic
version:#-Ubuntu SMP Tue Jul :: UTC
machine:i686
使用C语言获取linux系统相关信息的更多相关文章
- Linux sysinfo获取系统相关信息
Linux中,可以用sysinfo来获取系统相关信息. #include <stdio.h> #include <stdlib.h> #include <errno.h& ...
- Linux下使用fstatfs/statfs查询系统相关信息
Linux下使用fstatfs/statfs查询系统相关信息 1. 功能 #include < sys/statfs.h > int statfs(const char *path, ...
- Linux系统在信息社会的发展
Linux系统在信息社会的发展 随着信息技术的高速发展并迅速渗透到社会生活的各个方面,Linux日益成为人们学习.工作.生活不可缺少的基本工具,再过不了几年,不会使用Linux,就会象不识字一样使人举 ...
- 获取Java系统相关信息
package com.test; import java.util.Properties; import java.util.Map.Entry; import org.junit.Test; pu ...
- 查看Linux系统软硬件信息
查看Linux系统软硬件信息 查看计算机CPU信息 cat /proc/cpuinfo 查看文件系统信息 cat /proc/filesystems 查看主机中断信息 cat /proc/interr ...
- uname---用于打印当前系统相关信息
uname命令用于打印当前系统相关信息(内核版本号.硬件架构.主机名称和操作系统类型等). 语法 uname(选项) 选项 -a或--all:显示全部的信息: -m或--machine:显示电脑类型: ...
- 获取系统相关信息 (CPU使用率 内存使用率 系统磁盘大小)
引言 在软件开个过程中,对于软件的稳定性和使用率也是我们需要关注的 . 使用sigar来监控,简单方便! 使用说明:下载sigar jar及配合sigar的dll文件来用,需要将dll文件放到JD ...
- Centos-操作系统相关信息-uname
uname 获取系统相关信息 相关选项 -a 显示全部信息 -m 显示系统CPU架构 x86_64 -n 显示主机名, 和 hostname 一样 -s 获取系统类型 -r 内核信息
- 查看Linux系统相关版本信息
1.“uname -a” 查看电脑以及操作系统的相关信息 2.“cat /proc/version” 查看运行的内核版本 3."cat /etc/redhat-release", ...
随机推荐
- c# 打开、保存文件对话框 和 文件夹选择对话框
1. OpenFileDialog openImageDialog = new OpenFileDialog(); openImageDialog.Filter = "Image Files ...
- (原)STL中vector的疑问
以前基本上没有用过STL,当然包括里面的vector.今天试验了一下. 主要看了这个网址: http://blog.csdn.net/phoebin/article/details/3864590 代 ...
- oracle 之 COMMENT
http://blog.csdn.net/liguihan88/article/details/3002403 无疑注释现在都被大家接受和认可,在大家编程用的IDE中都提供或有第三方插件来支持提取注释 ...
- Control character in cookie value, consider BASE64 encoding your value-Cookie保存中文出错[转]
项目当中用到cookie保存中文,但是会报如下错误: Control character in cookie value, consider BASE64 encoding your value 大概 ...
- android的数据存储方式
数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 ...
- LaTeX中titlesec宏包的使用
在 xelatex 中使用 \usepackage 指令使用 titlesec 宏包时,可以指定一些格式选项,如下: \usepackage[center]{titlesec} 其中 center 可 ...
- aspx和razor的区别
两者几乎都不懂,现在要选择一种,只能百度,然后一条一条看,也不知道诸位大神哪个说的对. 两个引擎语法完全不一样,性能上Asp.Net略占优势,语法糖则是razor的强项. 开发MVC3首选razor ...
- Oracle 11gR2 RAC 安装配置
1. 简介 Oracle RAC,全称real application clusters,译为"实时应用集群", 是Oracle新版数据库中采用的一项新技术,是高可用性的一种, ...
- [置顶] 如何把你的笔记本电脑变成一个Wi-Fi路由器在Windows 7 & 8?
翻译自:http://www.hakanakdag.net/windows/how-to-create-wireless-ad-hoc-internet-connection-in-windows-8 ...
- 【FSFA 读书笔记】Ch4 Volume Analysis & Cr 5 PC-based Partitions
Volume Analysis 1. “卷”可以理解为从逻辑上对物理存储设备的重新编制,便于操作系统管理. (A volume is a collection of addressable secto ...