微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

exec()C中的任何命令

在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(),其中参数是该数组中的第一个元素和数组的地址.

原文地址:https://www.jb51.cc/c/116843.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐