JJ *_*Liu 8 c linux shell execvp
在C中说,我想调用execvp()任何字符串命令.命令可以是:
char command[] = "ls -l";
char command[] = "rm *.txt";
char command[] = "cat makefile";
Run Code Online (Sandbox Code Playgroud)
我想把这个命令变量放在里面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};
Run Code Online (Sandbox Code Playgroud)
这是一个非常重要的练习,特别是如果你想允许引用,通配,逃避等等.
引用意味着您必须小心使用以下命令:
rm "file with spaces.txt"
Run Code Online (Sandbox Code Playgroud)
因为你不能简单地打破空格 - 你必须解释命令中的项目与shell一样.简单地打破空格会给你一个命令,上面有一个字符串,而不是正确的字符串.
通过globbing,我的意思是你几乎肯定会遇到类似问题,*.txt因为它通常是扩展这些参数的shell.直接传递execvp()将导致单个参数字面*.txt而不是许多参数匹配当前目录中的所有文本文件.
引用意味着您必须处理以下事项:
ls -l "file with spaces and \" quote in it"
Run Code Online (Sandbox Code Playgroud)
这将进一步使您的解析器复杂化.
不要误会我的意思,这可以做到,但这可能只是使用时更容易看到system().
如果你还在考虑走这execvp()条路,你必须:
execvp()参数是该数组中的第一个元素和数组的地址.不,exec函数系列不像那样采用单个字符串命令行system。相反,它使用一个argv-like 字符串数组:
char *command = "/path/to/command";
char *arguments[] = { "command", "first argument", "second argument", NULL };
execvp(command, arguments);
Run Code Online (Sandbox Code Playgroud)
请注意,第一个条目 arguments数组是命令本身,数组以NULL.
你检查手册页了吗?
| 归档时间: |
|
| 查看次数: |
22063 次 |
| 最近记录: |