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