最近在寫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