C - 使用execvp和用户输入

时间:2012-02-14 00:02:08

标签: c pointers const execvp

我正在尝试让我的C程序从用户那里读取Unix参数。到目前为止,我一直在搜索这个网站,但我无法确切地知道我做错了什么 - 尽管我的指针实现技能确实相当有限。

以下是我现在的代码方式;我一直在乱搞指针而没有运气。错误也说我需要使用const * char,但我在其他例子中看到* char可以由用户输入。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

main()
{
    char args[128];
    //User input
    printf("> ");
    fgets(args, 128, stdin);
    execvp(args[0], *args[0]);
}

我得到的错误如下:

smallshellfile.c: In function ‘main’:
smallshellfile.c:13:21: error: invalid type argument of unary ‘*’ (have ‘int’)
smallshellfile.c:13:5: warning: passing argument 1 of ‘execvp’ makes pointer from integer without a cast [enabled by default]
/usr/include/unistd.h:575:12: note: expected ‘const char *’ but argument is of type ‘char’

有谁知道问题可能是什么?

2 个答案:

答案 0 :(得分:2)

你有几个问题:

  1. *args[0]毫无意义。 args是数组。 args[0]是char。什么是*args[0]

  2. 您必须创建一个以NULL结尾的char*数组,作为第二个参数传递。

  3. args[0]args中的第一个字符。你应该传递整个字符串(只是args),而不仅仅是它的第一个字符。

  4. 尝试类似:

    char *argv[]={args,NULL};
    execvp(args,argv);
    

答案 1 :(得分:0)

这可能对您更有效:

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    char args[128];
    char *argv[] = { "sh", "-c", args, 0 };
    printf("> ");
    if (fgets(args, 128, stdin) != 0)
    {
        execvp(argv[0], argv);
        fprintf(stderr, "Failed to exec shell on %s", args);
        return 1;
    }
    return 0;
}

它具有最少的必要标题;它有一个正确声明的main() - C99需要一个显式的返回类型;它在用户输入的信息上运行shell。除非用户在点击返回之前键入超过126个字符,否则错误消息将被换行正确终止。如果execvp()或任何exec*()函数返回,则失败;你不需要测试它的状态。

我通过让she​​ll做真正的工作来欺骗现象。但是你可能最终想要将用户键入的内容拆分为单词,因此命令是第一个且有多个参数。然后,您分配了一个更大的argv数组,并解析字符串,将每个单独的参数放入argv中的自己的条目中,然后使用execvp()开始有意义。请注意,如果要进行I / O重定向,则必须执行此操作(除非您运行真正的shell为您执行此操作 - 就像我一样)。