最近在做一個項目,遇到要在程序中動態的獲取設備硬件信息。糾結了我很長時間,今天突然發現原來在linux中有API函數直接就可以實現。對於好東西,當然要和大家share下了。
一.uname()函數
1.使用uname函數來實現獲取系統信息
1>函數原型
#include <sys/utsname.h>
int uname(struct utsname *buf);
2>函數功能:
該函數會告訴我們系統的相關信息。
3>函數返回值
函數返回信息存放在struct utsname結構體buf中,當函數成功時會返回0,當發生錯誤時會返回-1。
4>struct utsname的定義如下:
#include<sys/utsname.h>
struct utsname{
char sysname[SYS_NMLN];
char nodename[SYS_NMLN];
char release[SYS_NMLN];
char version[SYS_NMLN];
char machine[SYS_NMLN];
char __domainname[SYA_NMLN];
};
結構體成員描述如下:
Ø sysname:表示正在使用的操作系統。對於Linux而言,這個值為“Linux”。
Ø nodename: 表示設備的主機名
Ø release: 操作系統發布號
Ø version: 操作系統版本號
Ø machine 代表主機的硬件類型,例如“i686”代表一個奔騰CPU.
Ø domainname 返回主機的域名
2.程序實例:
#include<unistd.h>
#include<string.h>
#include<errno.h>
#include<sys/utsname.h>
int main(int argc,char **argv)
{
int s;
struct utsname u_name;
s = uname(&u_name);
if (s < 0){
printf(“uname()failed\n”);
exit(1);
}
printf(“sysname[]=%s\n”,u_name.sysname);
printf(“nodename[]=%s\n”,u_name.nodename);
printf(“release[]=%s\n”,u_name.release);
printf(“version[]=%s\n”,u_name.version);
printf(“machin[]=%s\n”,u_name.machine);
printf(“domainname[]=%s\n”,u_name.__domainname);
}
二.gethostname和getdomainname函數
通過這兩個函數可以實現獲得設備的主機名和域名
1.gethostname()函數
1>函數功能:
可以用來確定當前的主機名。
2>函數原型:
#include<unistd.h>
int gethostname(char *name,size_t len);
3>函數形參
Ø name:接收緩沖區。
Ø len:接收緩沖區的最大長度
4>函數返回值
如果函數執行成功,則返回零;如果發生錯誤則返回-1。錯誤號存放在外部變量errno中。
2.getdomainname()函數
1>函數功能
可以允許主機獲得程序正在運行的主機的NIS域名。
2>函數原型
#include<unistd.h>
int getdomainname(char *name,size_t len);
3>函數形參
Ø name:接收緩沖區。
Ø len:接收緩沖區的最大長度
4>函數返回值
如果函數執行成功,則返回零;如果發生錯誤則返回-1。錯誤號存放在外部變量errno中。
3.函數實例
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<errno.h>
int main(int argc,char **argv)
{
int s;
char buf[32];
s = gethostname(buf,sizeof(buf));
if( s < 0){
printf(“gethostname:failed:\n”);
exit(1);
}
printf(“host name:%s\n”,buf);
s = getdomainname(buf,sizeof(buf));
if(s <0){
printf(“getdomainname()failed\n”);
exit(1);
}
printf(“the domain name=%s\n”,buf);
return 0;
}