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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...