2014-03-02 40 views
2

我正在编写一个迷你UNIX shell,它支持内置的UNIX命令以及一些自定义命令。我需要检查在如何添加一个命令来检查linux shell中的电池电量?

if (strcmp("BatteryLevel", commandArgv[0]) == 0) { 

       printf("The battery level is ",); 
       return 1; 
     } 

我已经写了壳的块,所有的分析和内置命令工作作风我的C-shell代码内的电池水平。我也知道如何从终端(https://askubuntu.com/questions/69556/how-to-check-battery-status-using-terminal)检查电池电量,但是我无法理解我在代码中如何做到这一点。 感谢您的帮助。

+0

从[upower] [http:// packages]的[源代码](http://git.debian.org/?p=pkg-utopia/upower.git;a=summary)开始。 ubuntu.com/source/precise-updates/upower) –

+0

什么是“内置的UNIX命令”? – arkascha

+0

命令如cd,ls,date,jobs,kill,exit – Umut

回答

3

对于3.4.NN内核当前电池电量和最大可以达到在/sys/class/power_supply/BAT*可用(通常BAT0,你通常只有一个电池)中的文件charge_nowcharge_full。因此,遵循以下方面的内容应符合您的需求。

#include <stdio.h> 
#include <string.h> 
#include <errno.h> 
#include <dirent.h> 
#include <linux/limits.h> 
#include <regex.h> 

#define _DATADIR "/sys/class/power_supply" 

int main(int argc, char **argv) { 
    FILE *f_c, *f_f; 
    long current, full; 
    DIR *d; 
    struct dirent *dp; 
    char b[PATH_MAX]; 

    if((d = opendir(_DATADIR)) == NULL) { 
    fprintf(stderr, "opendir: %s\n", strerror(errno)); 
    return 3; 
    } 

    while((dp = readdir(d)) != NULL) { 
    snprintf(b, PATH_MAX, "%s/%s", _DATADIR, dp->d_name); 

    regex_t regex; 
    if(regcomp(&regex, "BAT[[:alnum:]]+", REG_EXTENDED) != 0) { 
     fprintf(stderr, "regcomp: %s\n", strerror(errno)); 
     return 4; 
    } 
    if(regexec(&regex, b, 0, NULL, 0) == 0) { 
     snprintf(b, PATH_MAX, "%s/%s/%s", _DATADIR, dp->d_name, "charge_now"); 
     f_c = fopen(b, "r"); 
     snprintf(b, PATH_MAX, "%s/%s/%s", _DATADIR, dp->d_name, "charge_full"); 
     f_f = fopen(b, "r"); 
     if(f_c != NULL && f_f != NULL) { 
     if(fscanf(f_c, "%ld", &current) != 1 || fscanf(f_f, "%ld", &full) != 1) 
      fprintf(stderr, "fscanf: %s\n", strerror(errno)); 
     else 
      fprintf(stdout, "charge for %s %.2f\n", dp->d_name, 
        (current/full) * 100.0); 
     fclose(f_c); 
     fclose(f_f); 
     } 
    } 
    regfree(&regex); 
    } 

    return 0; 
}