首页 > 解决方案 > C 将 char ** 转换为 char *[]

问题描述

我正在尝试从 C 程序运行 shell 命令。

我有一个命令结构:

struct Command {
    char * builtInCommand;
    char ** args;
    int argSize;
    //...
}typedef command;

builtInCommand表示内置的 shell 命令,如pwd, ls.

实际上,我无法运行execv函数,它代表一个 char * []。argsargs

这是有效的:

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 的代码 :)

标签: clinux

解决方案


推荐阅读