正确的硬编码命令行参数的方法

时间:2014-04-16 10:20:14

标签: c

以下代码basiaclly允许使用LED访问GPIO端口。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
int main(int argc, char *argv[])
{
    extern char *optarg;
    char *cptr;
    int gpio_value = 0;
    int nchannel = 0;

    int c;
    int i;

    opterr = 0;

    while ((c = getopt(argc, argv, "g:io:ck")) != -1) {
        switch (c) {
            case 'g':
                gl_gpio_base = (int)strtoul(optarg, &cptr, 0);
                if (cptr == optarg)
                    usage(argv[0]);
                break;
            case 'i':
                gpio_opt = IN;
                break;
            case 'o':
                gpio_opt = OUT;
                gpio_value = (int)strtoul(optarg, &cptr, 0);
                if (cptr == optarg)
                    usage(argv[0]);
                break;
            case 'c':
                gpio_opt = CYLON;
                break;
            case 'k':
                gpio_opt = KIT;
                break;
            case '?':
                usage(argv[0]);
            default:
                usage(argv[0]);

        }
    }

    if (gl_gpio_base == 0) {
        usage(argv[0]);
    }

    nchannel = open_gpio_channel(gl_gpio_base);
    signal(SIGTERM, signal_handler); /* catch kill signal */
    signal(SIGHUP, signal_handler); /* catch hang up signal */
    signal(SIGQUIT, signal_handler); /* catch quit signal */
    signal(SIGINT, signal_handler); /* catch a CTRL-c signal */
    switch (gpio_opt) {
        case IN:
            set_gpio_direction(gl_gpio_base, nchannel, "in");
            gpio_value=get_gpio_value(gl_gpio_base, nchannel);
            fprintf(stdout,"0x%08X\n", gpio_value);
            break;
        case OUT:
            set_gpio_direction(gl_gpio_base, nchannel, "out");
            set_gpio_value(gl_gpio_base, nchannel, gpio_value);
            break;
        case CYLON:
#define CYLON_DELAY_USECS (10000)
            set_gpio_direction(gl_gpio_base, nchannel, "out");
            for (;;) {
                for(i=0; i < ARRAY_SIZE(cylon); i++) {
                    gpio_value=(int)cylon[i];
                    set_gpio_value(gl_gpio_base, nchannel, gpio_value);
                }
                usleep(CYLON_DELAY_USECS);
            }
        case KIT:
#define KIT_DELAY_USECS (10000)
            set_gpio_direction(gl_gpio_base, nchannel, "out");
            for (;;) {
                for (i=0; i<ARRAY_SIZE(kit); i++) {
                    gpio_value=(int)kit[i];
                    set_gpio_value(gl_gpio_base, nchannel, gpio_value);
                }
                usleep(KIT_DELAY_USECS);
            }
        default:
            break;
    }
    close_gpio_channel(gl_gpio_base);
    return 0;
}

Genarlly我会发出这样的命令;

gpio-demo -g 255 -o 0
上面的

255告诉我芯片编号,000告诉我哪些数据将进入GPIO端口。

这将关闭所有LED。

然而,出于某些调试目的,我必须修改此代码,使其行为不同:

当运行程序时,tt应该只是关闭LED,即运行以下命令。

gpio-demo -g 255 -o 0

这是唯一可以进行硬编码的命令。 ON LED现在将关闭。

我尝试的是将命令作为main中的第一行插入:

int main(int argc, char *argv[])
    {


argv = "gpio-demo -g 255 -o 0"  //irrespective of what user what user type, run this command. gpio-demo is the binary of this program 
.
.
.
.

    }

这是硬编码命令行参数的正确方法吗?

1 个答案:

答案 0 :(得分:2)

如果你打电话给你这样的程序gpio-demo -g 255 -o 0,那么argc将等于5argv将是一个包含五个指向字符序列的指针的列表。第一个是gpio-demo,第二个是-g,第三个是255,...

因此,如果你真的想硬编码,你必须写:

argc = 5;
argv = (char**)malloc(sizeof(char*)*argc);
argv[0] = "gpio-demo";
argv[1] = "-g";
argv[2] = "255";
argv[3] = "-o";
argv[4] = "0";

但是,我不推荐这个!而是使用带有所需命令行的bash脚本。