【发布时间】:2016-11-14 18:52:05
【问题描述】:
我有一个方法execfile,它获取可执行文件的路径然后执行它,我现在正尝试添加选项,让用户在正在执行的命令中输入参数。我目前的实现方式如下:
int execfile(char *file) {
printf("Enter any arguments to %s: ", file);
char *arg = (char *) calloc(ARG_MAX, sizeof(char));
scanf("%s", arg);
execl(file, file, arg, NULL);
return -1;
}
这确实起作用,因为我可以执行/usr/bin/ps 并在参数提示符处输入el 或-el,该函数将按预期使用两个参数执行。
理想情况下,像传统上直接执行 C 程序时那样输入参数会更优雅,所以在提示符处输入 -e -l 并让程序正确解释它(目前这不起作用) , 或者直接按回车键跳过提示(目前至少要输入一些字符)。
我认为最好的方法是声明一个数组char *argv[],设置arg[0] = file,然后扫描输入的其余部分并将每个单独的参数放在一个数组单元格中,然后调用execv(file, argv)。
但是,我对 C 非常陌生,我不确定如何以最有效的方式实现这一点,例如,我考虑先读取整个字符串,然后使用循环逐个字符地遍历它以识别要添加到argv 的参数,但似乎有点啰嗦?有没有办法直接从stdin将这些参数读入数组?
此外,我不确定将 ARG_MAX 设置为什么,因为我不知道 C 中参数数量的限制是多少,也不知道如何让它识别已按下回车键所以立即跳过。
【问题讨论】:
-
请参阅stackoverflow.com/questions/9210528/… 和类似问题,了解如何将字符串拆分为数组。
-
另外,这个
execl(... , NULL);应该是execl(... , (char*) NULL); -
"有没有办法将这些参数读入数组":这个
char *argv[]没有定义数组,因为它的类型不完整,作为元素的数量不是在编译时指定的,不是直接的,也不是通过初始化程序间接指定的。 -
顺便说一句,
malloc()& Friends 的结果不需要在 C 中强制转换,也不推荐。 -
请注意,对于变量的参数列表,您不会使用
execl()或execlp();相反,您将使用execv()、execvp()或execve()之一——或者如果可用的话,可能是execvpe()。