使用C語言獲取linux系統相關信息


最近在寫shell的時候,涉及到了獲取環境變量參數和本地計算機相關信息,包括計算機設備名,用戶名的信息,在這里簡單總結一下。
獲取環境變量各項參數,可以直接使用getenv函數。man中關於getenv函數的聲明如下:

 #include <stdlib.h>
char *getenv(const char *name);

函數中,參數name 為環境變量的名稱, 如果該變量存在則會返回指向該內容的指針. 環境變量的格式為name=value。執行成功則返回指向該內容的指針, 找不到符合的環境變量名稱則返回NULL。

 這里我使用環境變量獲取用戶名稱和當前目錄為例,首先我們知道在環境變量中,用戶名保存在“LOGNAME”中,而當前目錄保存在"PWD"中,所以函數調用應該為

getenv(“LOGNAME”)
getenv(“PWD”);

所以,簡單的測試程序就出來了,程序源碼如下:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 int main(int argc,char **argv)
 6 {
 7     char *name;
 8     char *path;
 9 
10     name = getenv("LOGNAME");
11     path = getenv("PWD");
12 
13     printf("logname = %s\n",name);
14     printf("pwd = %s\n",path);
15 
16     return 0;
17 }

測試程序沒有包含錯誤錯誤,如有需要,請自行加上。在我的電腦上運行如下:

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中。

函數比較簡單,這里直接給出測試代碼:

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 
 4 int main(int argc, char **argv)
 5 {
 6     char hostname[32];
 7 
 8     if( gethostname(hostname,sizeof(hostname)) )
 9     {
10         perror("gethostname");
11         return (1);
12     }
13     printf("localhost name:%s\n",hostname);
14 
15     return 0;
16 }

在我的電腦上運行結果如下:

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中。

和上面一樣,比較簡單,測試代碼如下:

 1 #include <sys/utsname.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 
 5 int main(int argc,char **argv)
 6 {
 7     struct utsname buf;
 8 
 9     if(uname(&buf))
10     {
11         perror("uname");
12         exit(1);
13     }
14 
15     printf("sysname:%s\n",buf.sysname);
16     printf("nodename:%s\n",buf.nodename);
17     printf("release:%s\n",buf.release);
18     printf("version:%s\n",buf.version);
19     printf("machine:%s\n",buf.machine);
20 
21     return 0;
22 }

我的電腦上運行結果如下:

wangbo@iDina-PC:~/linuxc/tmp$ ./a.out 
sysname:Linux
nodename:iDina-PC
release:3.13.0-32-generic
version:#57-Ubuntu SMP Tue Jul 15 03:51:12 UTC 2014
machine:i686


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM