为什么在一个简单的C程序中,命令execl("/bin/ls", NULL);会返回一个用法错误,而命令execl("/bin/ls", "badfsafds", NULL);会返回目录中的文件列表?
我知道execl的第一个参数是路径规范,但我认为它只用于路径规范,而不是命令执行。谢谢。
发布于 2021-02-27 05:53:06
下面是一个正确用法的好例子:
#include int main(空){ char *binaryPath = "/bin/ls";char *arg1 = "-lh";char *arg2 = "/home";execl(binaryPath,binaryPath,arg1,arg2,NULL);return 0;}
您会注意到,如果您打印任何标准C程序的argv[0],它将显示正在执行的命令。
发布于 2021-02-27 06:06:37
第一个参数指定路径,即yes。
第二个和后续的参数提供传递给程序的参数,例如作为main()的argv参数,从argv[0]开始。
因此,第一个示例导致ls使用一个空的argv向量运行,其中argv[0]为NULL。大多数程序假设argv[0]将是一个以某种形式指定程序名称的有效字符串,如果它为NULL,它们将崩溃或无法工作。因此,您不应该这样做。
您的第二个示例导致ls在argv[0]设置为"badfsafds"且没有其他参数的情况下运行。argv[0]的不同寻常的值在很大程度上可能不会影响它的行为。但是例如,如果它给出一个错误消息,比如说如果你在一个你没有读权限的目录中运行它,它将包含给定的argv[0]并报告类似于badfsafds: cannot open directory '.': Permission denied的东西。除此之外,它的工作方式与您在shell中运行ls的任何其他时间一样,不带参数,并列出当前目录。
(某些程序确实会根据argv[0]的值更改其行为。例如,在我的系统上,cal和ncal是指向同一可执行文件的符号链接。这个可执行文件查看它的argv[0]以确定它是如何运行的,并且根据它看到的是cal还是ncal,它将相应地调整其输出格式。但我不认为ls有这样的行为。)
发布于 2021-02-28 01:46:56
(注意:在下面的所有解释中,假设您使用对main()例程的参数调用argc和argv的约定,如果您不像这里这样调用它们,那么您需要在下面显示它们的位置更改它们的名称。)
execl()的参数按顺序如下:
argv[0],这是程序的名字(也是)。您可以将从新程序内部看到的任何其他字符串作为argv[0]。(见下文以获得有趣的效果)argv[1]、argv[2]等形式出现,直到最终的NULL值,该值向execl指示参数列表的末尾。它在程序中也被视为argv[argc],并且也等同于NULL.因此,要调用ls,您需要使用:
execl("/bin/ls", "ls", NULL);或者,如果你想给它传递参数:
execl("/bin/ls", "ls", "-l", "/etc/passwd", NULL);您使用的第一个调用会给您一个错误,因为您将NULL作为程序名(argv[0])传递,第二个调用会被接受,但对ls的调用使用了错误的名称( ls内部不介意您是否更改它),并且没有命令行参数,因此它列出了目录"."。
要使其有效,您可以像这样调用execl:
execl("/bin/ls", "What the hell?", "badfsafds", NULL);你应该得到:
What the hell?: badfsafds: No such file or directory您将看到,尽管没有检查它是否被使用与加载的文件不同的名称调用,但它使用它在错误消息中声明自己。
https://stackoverflow.com/questions/66393208
复制相似问题