使用Execvp从参数中获取ls

时间:2017-06-03 05:15:43

标签: c linux

我是C的新手,并试图了解为什么此代码只返回当前目录文件列表而不是我传递给的目录。

我使用了c11标准gcc编译器

并且只使用./a.out filedirectory .....

int main(int argc, char *argv[])
{

        char*args[3];
        if(argc > 1)
        {
                args[0] = "/bin/ls";
                args[1] = "-l";
                if(argv[2])
                {
                        args[2] = argv[2];
                        args[3] = NULL;
                }
                else
                {
                        args[2] = NULL;
                }

                execvp(args[0],args);

                return 0;
        }
}

1 个答案:

答案 0 :(得分:2)

您没有告诉自己如何运行程序myprog。我们假设您将其作为(例如)./myprog /tmp/运行。

C programming language(读n1570)数组索引从0开始!

然后输入您的main

  • argc是2
  • argv[0]"./myprog"字符串
  • argv[1]"/tmp/"字符串
  • argv[2]NULL指针(由main的C规范保证并由crt0实现),因为它是main函数< / LI>

(在C的所有其他情况下,指针数组隐式NULL终止,但main的{​​{1}}是特殊的)功能

使用铅笔或使用argv调试器跟随您的程序源。第一个gdb成功,但第二个if (argc > 0)失败。然后,if (argv[2])设置为args[0]"/bin/ls"设置为args[1]"-l"设置为args[2] NULL

请参阅execvp(3)execve(2)并阅读Advanced Linux Programming

你真的应该养成所有警告的编译习惯。调试信息(execvpGCC,例如将gcc -Wall -Wextra -g源文件编译为yoursource.c可执行文件myprog)并了解如何使用调试器{{ 1}}

顺便说一句,您对gcc -Wall -Wextra -g yoursource.c -o myprog的使用是undefined behavior(越界索引或buffer overflow),因此您应该scared,因为gdb已声明作为维度3的数组(因此有效索引仅为0,1和2)。在您的情况下,最近的GCC会警告您。