exec()C中的任何命令

exec()C中的任何命令,第1张

概述在C中说,我想在任何字符串命令上调用execvp().命令可以是: char command[] = "ls -l";char command[] = "rm *.txt";char command[] = "cat makefile"; 我想把这个命令变量放在execvp()中.所以exec()风味的函数可以运行任何类型的任意命令. 我怎样才能做到这一点?谢谢. 注意:不允许使用system 在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(),其中参数是该数组中的第一个元素和数组的地址.

总结

以上是内存溢出为你收集整理的exec()C中的任何命令全部内容,希望文章能够帮你解决exec()C中的任何命令所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1236294.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存