c - C 将 char ** 转换为 char *[]
问题描述
我正在尝试从 C 程序运行 shell 命令。
我有一个命令结构:
struct Command {
char * builtInCommand;
char ** args;
int argSize;
//...
}typedef command;
builtInCommand
表示内置的 shell 命令,如pwd
, ls
.
实际上,我无法运行execv函数,它代表一个 char * []。args
args
这是有效的:
execl(src, c->builtInCommand, c->args[0], c->args[1], c->args[2], NULL);
但这不是:
execv(src, c->args);
我不知道我有多少论据,所以我想使用c->args
方法。
这是完整的代码:
void runBuiltIn(command * c) {
char src[strlen(c->builtInCommand) + strlen("/bin/")];
strcpy(src, "/bin/");
strcat(src, c->builtInCommand);
/*Spawn a child to run the program.*/
pid_t pid=fork();
if (pid==0) { /* child process */
execv(src, c->args);
exit(127); /* only if execv fails */
}
else { /* pid!=0; parent process */
waitpid(pid,0,0); /* wait for child to exit */
}
}
如果我给args
它添加 2 个参数,则根据第二个参数打印结果并绕过第一个数组元素。
为什么 execv 函数没有将我的 args 正确传递给 shell 命令?
输出:
案例一:execl(src, c->builtInCommand, c->args[0], c->args[1], c->args[2], NULL);
>ls
CMakeCache.txt CMakeFiles cmake_install.cmake Makefile Shell Shell.cbp
>ls -a
. CMakeCache.txt cmake_install.cmake Shell
.. CMakeFiles Makefile Shell.cbp
>ls -a -l
total 72
drwxrwxr-x 3 md7zn4 md7zn4 4096 Nov 28 02:29 .
drwxrwxr-x 8 md7zn4 md7zn4 4096 Nov 26 00:28 ..
-rw-rw-r-- 1 md7zn4 md7zn4 19444 Nov 24 21:46 CMakeCache.txt
drwxrwxr-x 5 md7zn4 md7zn4 4096 Nov 28 02:29 CMakeFiles
-rw-rw-r-- 1 md7zn4 md7zn4 1553 Nov 24 21:46 cmake_install.cmake
-rw-rw-r-- 1 md7zn4 md7zn4 6467 Nov 26 00:28 Makefile
-rwxrwxr-x 1 md7zn4 md7zn4 19856 Nov 28 02:29 Shell
-rw-rw-r-- 1 md7zn4 md7zn4 6060 Nov 26 00:28 Shell.cbp
案例二: execv(src, c->args)
>ls
A NULL argv[0] was passed through an exec system call.
>ls -a
CMakeCache.txt CMakeFiles cmake_install.cmake Makefile Shell Shell.cbp
>ls -l -a
. CMakeCache.txt cmake_install.cmake Shell
.. CMakeFiles Makefile Shell.cbp
>ls -a -l
total 64
-rw-rw-r-- 1 md7zn4 md7zn4 19444 Nov 24 21:46 CMakeCache.txt
drwxrwxr-x 5 md7zn4 md7zn4 4096 Nov 28 02:33 CMakeFiles
-rw-rw-r-- 1 md7zn4 md7zn4 1553 Nov 24 21:46 cmake_install.cmake
-rw-rw-r-- 1 md7zn4 md7zn4 6467 Nov 26 00:28 Makefile
-rwxrwxr-x 1 md7zn4 md7zn4 19848 Nov 28 02:33 Shell
-rw-rw-r-- 1 md7zn4 md7zn4 6060 Nov 26 00:28 Shell.cbp
只是我想要案例 1 的输出,以及案例 2 的代码 :)
解决方案
推荐阅读
- javascript - 在 JSON 数组中搜索时间并将其转换为 'epochtime'
- powershell - Powershell 调用已取消
- google-maps - 如何在 Xamarin 表单中实现谷歌地图
- python - 如何将列表列表中与第一个列表中的单词匹配的单词替换为与第二个列表中的第一个单词具有相同位置的单词?
- postgresql - 试图用新的、简化的 the_geom 更新 PostGIS the_geom 列?
- xcode - 如何读取在本地 xcode 9、Swift 语言 4 中创建的(JSON 或 Txt 或 XMl 或 XML)文件
- c# - 是否可以将字符串从后台任务传输到主程序 UWP?
- react-native - 在反应导航中导航到不同的堆栈
- angular - 我不明白为什么这些图标不起作用
- angular - HttpClient 的 Observable 无法从 HttpResponse 正确映射