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(),其中参数是该数组中的第一个元素和数组的地址.
总结以上是内存溢出为你收集整理的exec()C中的任何命令全部内容,希望文章能够帮你解决exec()C中的任何命令所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)