2012-02-14 38 views
0

我目前正试图让我的C程序读取来自用户的Unix参数。我到目前为止搜索了这个网站,但我一直无法弄清楚我做错了什么 - 虽然我承认我的指针实现技能是相当有限的。C - 使用execvp和用户输入

以下是我现在的代码;我一直在与没有运气的指针搞混了。错误也是说我需要使用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

你有几个问题:

  1. *args[0]是没有意义的。 args是数组。 args[0]是char。什么是*args[0]

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

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

试着这么做:

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

不要忘记,命令名在'argv [0]'中出现,在'argv [1]'中出现第一个参数,在'argv [2]'中出现空指针。 – 2012-02-14 00:19:14

+0

@JonathanLeffler如果我正确地阅读了这个问题,他不想传递任何参数(程序名除外),所以NULL应该在'argv [1]'中。 – asaelr 2012-02-14 00:24:09

+0

[0]只是因为我用完了想法。我摆脱了他们,并做出了修改 - 我编译时的错误消失了,但执行程序在被调用时不会执行任何操作 - 即如果我尝试ls,它只会终止程序。 – limasxgoesto0 2012-02-14 00:25:13

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*()函数返回,则失败;你不需要测试它的状态。

我正在通过让壳做真正的工作而惊人地作弊。但是你最终可能想要将用户输入的内容分解成单词,这样命令就是第一个,并且有多个参数。然后,您会分配一个更大的argv数组,然后解析该字符串,将每个单独的参数放入其自己的条目argv中,然后使用execvp()开始有意义。请注意,如果要完成I/O重定向,那么它就是你的shell必须要做的(除非你运行真正的shell来为你做 - 就像我一样)。