zoukankan      html  css  js  c++  java
  • 使用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
    ",name);
    14     printf("pwd = %s
    ",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
    ",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
    ",buf.sysname);
    16     printf("nodename:%s
    ",buf.nodename);
    17     printf("release:%s
    ",buf.release);
    18     printf("version:%s
    ",buf.version);
    19     printf("machine:%s
    ",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
    本文采用以下协议进行授权: 自由转载-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处。
  • 相关阅读:
    DB-MySQL:MySQL 函数
    DB-MySQL:目录
    文学-人物:王阳明
    院校:伦敦大学学院
    文学-人物:曹操
    文学-人物:诸葛亮
    x2go
    PHP+jQuery 注册模块开发
    java中Runtime类详细介绍
    java中Runtime类详细介绍
  • 原文地址:https://www.cnblogs.com/wangbo2008/p/3866188.html
Copyright © 2011-2022 走看看