2014-03-02 41 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; 
}