C – 使用execvp和用户输入
我正在尝试让我的C程序从用户那里读取Unix参数。 到目前为止,我一直在搜索这个网站,但是我还没弄清楚到底我做错了什么 – 尽管我的指针实现技能相当有限。
以下是我现在的代码方式; 我一直在乱搞指针而没有运气。 错误也说我需要使用const * char,但我在其他例子中看到* char可以由用户输入。
#include #include #include #include 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'
有谁知道问题可能是什么?
你有几个问题:
-
*args[0]
毫无意义。args
是数组。args[0]
是char。 什么是*args[0]
? -
您必须创建一个以NULL结尾的
char*
数组,作为第二个参数传递。 -
args[0]
是args[0]
中的第一个char。 你应该传递整个字符串(只是args
),而不仅仅是它的第一个字符。
尝试以下方法:
char *argv[]={args,NULL}; execvp(args,argv);
这可能对你更好:
#include #include 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*()
函数返回,则失败; 你不需要测试它的状态。
我通过让shell做真正的工作来欺骗现象。 但是你最终可能想要将用户键入的内容拆分为单词,因此命令是第一个且有多个参数。 然后你分配了一个更大的argv
数组,并解析了字符串,将每个单独的参数放入argv
自己的条目中,然后使用execvp()
开始有意义。 请注意,如果要进行I / O重定向,则必须执行此操作(除非您运行真正的shell为您执行此操作 – 就像我一样)。