在 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 那样解释命令中的项目。简单地打破空格会给你一个带有上面那个字符串的三个参数的命令,而不是正确的一个。
通过通配,我的意思是您几乎肯定会遇到类似 *.txt
的问题,因为它通常是扩展这些参数的 shell。将其直接传递给 execvp()
将导致 单个 字面上的 *.txt
参数,而不是匹配您的所有文本文件的许多参数当前目录。
引用意味着您必须处理以下事情:
ls -l "file with spaces and \" quote in it"
这将使您的解析器更加复杂。
不要误会我的意思,这是可以做到的,但使用 system()
可能会更容易一些。
如果您仍在考虑采用 execvp()
路线,您必须:
- 将字符串拆分为单独的标记(相当困难,因为您必须处理引号和转义符)。
- glob 所有参数,这意味着其中带有通配符的参数(并且只有那些没有被转义或由于在引号内而受到保护的参数)被扩展为多个参数。
- 构造参数数组,前面是命令,最后是NULL。
- 调用
execvp()
,参数是该数组中的第一个元素和数组的地址。
关于c - exec() C 中的任何命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8089351/