【问题标题】:C: map a command-line arg to a compile-time constantC:将命令行参数映射到编译时常量
【发布时间】:2018-07-29 16:36:44
【问题描述】:

我正在编写一个接受系统资源名称(例如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;
}

【问题讨论】:

    标签: c command-line-arguments compile-time-constant


    【解决方案1】:

    RLIMIT_x 常量都是低值整数,可用作数组的索引,(针对您的问题)使用数组查找索引,它将对应于你想要的价值。

    或者你可以有一个结构数组,包含值和字符串。类似的东西

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

    然后很容易遍历数组并将字符串“映射”到一个值(或相反)。

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 2011-09-09
      • 1970-01-01
      相关资源
      最近更新 更多