在C中说,我想在任何字符串命令上调用execvp().命令可以是:
char command[] = "ls -l"; char command[] = "rm *.txt"; char command[] = "cat makefile";
我想把这个命令变量放在execvp()中.所以exec()风味的函数可以运行任何类型的任意命令.
我怎样才能做到这一点?谢谢.
注意:不允许使用system().
解决方法
如果必须调用execvp(),则需要将这些字符串拆分为可执行文件名和参数数组(第一个是程序的“名称”,最后一个是NULL指针).
这意味着:
char cmd1[] = "ls"; char *args1[] = {"ls","-l",NULL}; char cmd1[] = "rm"; char *args1[] = {"rm","*.txt",NULL}; // but see // globbing below. char cmd1[] = "cat"; char *args1[] = {"cat","makefile",NULL};
这是一个非常重要的练习,特别是如果你想允许引用,通配,逃避等等.
引用意味着您必须小心使用以下命令:
rm "file with spaces.txt"
因为你不能简单地打破空格 – 你必须解释命令中的项目与shell一样.简单地打破空格会给你一个命令,上面有一个字符串,而不是正确的字符串.
通过globbing,我的意思是你几乎肯定会遇到类似* .txt的问题,因为它通常是扩展这些参数的shell.将其直接传递给execvp()将导致单个参数* .txt,而不是与当前目录中的所有文本文件匹配的许多参数.
引用意味着您必须处理以下事项:
ls -l "file with spaces and \" quote in it"
这将进一步使您的解析器复杂化.
不要误解我,可以做到,但是使用system()可能会更容易.
如果您仍在考虑使用execvp()路由,则必须:
>将字符串拆分为单独的标记(相当难,因为您必须处理引号和转义).> glob所有参数,意味着那些带有通配符的那些(并且只有那些因为在引号内没有被转义或保护的)被扩展为多个参数.>构造参数数组,使用前面的命令和结尾的NULL.>调用execvp(),其中参数是该数组中的第一个元素和数组的地址.