簡體   English   中英

C:將命令行arg映射到編譯時常量

[英]C: map a command-line arg to a compile-time constant

我正在編寫一個接受系統資源名稱(例如RLIMIT_NOFILE )並為其打印一些資源限制信息的C程序。

資源常量在<sys/resource.h>中定義,例如

#define RLIMIT_NOFILE   5

我正在尋找一種將命令行參數(例如RLIMIT_NOFILE )映射到相應數值(例如5)的好方法。

我最初打算做類似的事情:

int resource = -1;
char *resource_names[] = {
    "RLIMIT_NOFILE", "RLIMIT_NPROC", "RLIMIT_RSS"
};

for (i = 0; i < sizeof(resource_names)/sizeof(char *); i++) {
    if (strcmp(argv[1], resource_names[i]) == 0) {
        resource = eval(resource_names[i]);
        break;
    }
}

但是C似乎沒有eval東西,即使這樣做,編譯時常量在運行時也不可用。

現在,我正在做以下事情,但是我很好奇是否有更好的方法。

#include <stdio.h>
#include <string.h>
#include <sys/resource.h>

int main(int argc, char *argv[])
{
    if (argc != 2) {
        printf("Usage: %s <resource>\n", argv[0]);
        return 1;
    }

    char *resource_names[] = {
        "RLIMIT_NOFILE", "RLIMIT_NPROC", "RLIMIT_RSS"
    };
    int resources[] = {
        RLIMIT_NOFILE, RLIMIT_NPROC, RLIMIT_RSS
    };
    int i, resource = -1;

    for (i = 0; i < sizeof(resources)/sizeof(int); i++) {
        if (strcmp(argv[1], resource_names[i]) == 0) {
            resource = resources[i];
            break;
        }
    }
    if (resource == -1) {
        printf("Invalid resource.\n");
        return 1;
    }

    struct rlimit rlim;
    getrlimit(resource, &rlim);
    printf("%s: %ld / %ld\n", argv[1], rlim.rlim_cur, rlim.rlim_max);

    return 0;
}

RLIMIT_x常量都是可以用作數組索引的所有低值整數, 或者 (針對您的問題)使用數組來查找索引,並且該索引將與所需的值相對應。

或者,您可以有一個結構數組,同時包含值和字符串。 就像是

static const struct
{
    int limit;
    char *name;
} rlimits[] = {
    { RLIMIT_NOFILE, "RLIMIT_NOFILE" },
    { RLIMIT_NPROC, "RLIMIT_NPROC" },
    // Etc.
};

然后,很容易遍歷數組並將字符串“映射”到值(或相反)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM