我正在尝试将用户输入的参数传递给execvp()

到目前为止,我已经分解了字符串。如果用户键入ls -a,则temp保存为“ls”和“-a”,后跟一个NULL字符。我不太确定如何在execvp中正确地指出这一点。在示例中,我使用execvp(temp[position], temp)看到了它。我知道我目前尝试的方法是错误的,但是我不确定如何正确执行!目前,我遇到了段错误。

int main(int argc, char *argv[])
{
    char line[124];
    int size = 124;
    char *temp = NULL;

    while(fgets(line, size, stdin) != NULL ) {
        if (strcmp(line, "exit\n") == 0) {
            exit(EXIT_SUCCESS);
        }
        temp = strtok(line, " ");
        while (temp != NULL) {
            printf("%s\n", temp);
            temp = strtok(NULL, " ");
        }
        execvp(temp, &temp);
    }
    return EXIT_SUCCESS;
}

最佳答案

您的问题是temp是单个指针,您需要将一个指针数组传递给execvp()

就像是:

    enum { MAX_ARGS = 64 };
    char *args[MAX_ARGS];
    char **next = args;

    temp = strtok(line, " ");
    while (temp != NULL)
    {
        *next++ = temp;
        printf("%s\n", temp);
        temp = strtok(NULL, " ");
    }
    *next = NULL;
    execvp(args[0], args);

请注意,参数列表已被赋予一个空指针作为终止符,就像argv[argc] == NULL中的main()一样。显然,我跳过了错误检查(如果您传递的参数超过63个,则将溢出args数组)。但这包含了核心思想。



我不确定可能是什么问题,所有这些对我来说都是有效的:
  • ls
  • ls -l
  • ls -l madump.c(其中madump.c恰好是我正在测试的目录中的文件)

  • 我使用的代码是:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    
    int main(void)
    {
        char line[1024];
    
        while (fgets(line, sizeof(line), stdin) != NULL)
        {
            if (strcmp(line, "exit\n") == 0)
                exit(EXIT_SUCCESS);
    
            char *args[64];
            char **next = args;
            char *temp = strtok(line, " \n");
            while (temp != NULL)
            {
                *next++ = temp;
                printf("%s\n", temp);
                temp = strtok(NULL, " \n");
            }
            *next = NULL;
    
            puts("Checking:");
            for (next = args; *next != 0; next++)
                puts(*next);
    
            execvp(args[0], args);
        }
    
        return EXIT_SUCCESS;
    }
    

    请注意,在创建目录名称后带有换行符的目录之后,我将\n添加到strtok() token 列表中。对烦人的 friend 和令人困惑的半受过教育的敌人很有好处,但从其他大多数角度来看却很讨厌。请注意,我实际上是如何打印出将要传递给execvp()的数据的。通常,我会使用printf("<<%s>>\n", *next);而不是puts()来明确指示参数的开始和结束位置。

    运行命令(doit)的输出为:
    $ ./doit
    ls -l madump.c
    ls
    -l
    madump.c
    Checking:
    ls
    -l
    madump.c
    -rw-r--r--  1 jleffler  staff  2352 Jul 28  2011 madump.c
    $
    

    您从您的版本中学到了什么?

    关于c - 从用户输入将数组传递给execvp(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15539708/

    10-12 03:10