首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >execl参数混淆

execl参数混淆
EN

Stack Overflow用户
提问于 2021-02-27 05:48:25
回答 3查看 98关注 0票数 2

为什么在一个简单的C程序中,命令execl("/bin/ls", NULL);会返回一个用法错误,而命令execl("/bin/ls", "badfsafds", NULL);会返回目录中的文件列表?

我知道execl的第一个参数是路径规范,但我认为它只用于路径规范,而不是命令执行。谢谢。

EN

回答 3

Stack Overflow用户

发布于 2021-02-27 05:53:06

下面是一个正确用法的好例子:

https://linuxhint.com/exec_linux_system_call_c/

#include int main(空){ char *binaryPath = "/bin/ls";char *arg1 = "-lh";char *arg2 = "/home";execl(binaryPath,binaryPath,arg1,arg2,NULL);return 0;}

您会注意到,如果您打印任何标准C程序的argv[0],它将显示正在执行的命令。

票数 3
EN

Stack Overflow用户

发布于 2021-02-27 06:06:37

第一个参数指定路径,即yes。

第二个和后续的参数提供传递给程序的参数,例如作为main()argv参数,从argv[0]开始。

因此,第一个示例导致ls使用一个空的argv向量运行,其中argv[0]为NULL。大多数程序假设argv[0]将是一个以某种形式指定程序名称的有效字符串,如果它为NULL,它们将崩溃或无法工作。因此,您不应该这样做。

您的第二个示例导致lsargv[0]设置为"badfsafds"且没有其他参数的情况下运行。argv[0]的不同寻常的值在很大程度上可能不会影响它的行为。但是例如,如果它给出一个错误消息,比如说如果你在一个你没有读权限的目录中运行它,它将包含给定的argv[0]并报告类似于badfsafds: cannot open directory '.': Permission denied的东西。除此之外,它的工作方式与您在shell中运行ls的任何其他时间一样,不带参数,并列出当前目录。

(某些程序确实会根据argv[0]的值更改其行为。例如,在我的系统上,calncal是指向同一可执行文件的符号链接。这个可执行文件查看它的argv[0]以确定它是如何运行的,并且根据它看到的是cal还是ncal,它将相应地调整其输出格式。但我不认为ls有这样的行为。)

票数 3
EN

Stack Overflow用户

发布于 2021-02-28 01:46:56

(注意:在下面的所有解释中,假设您使用对main()例程的参数调用argcargv的约定,如果您不像这里这样调用它们,那么您需要在下面显示它们的位置更改它们的名称。)

execl()的参数按顺序如下:

  • 第一个是要加载以供执行的文件名。内核使用它将程序加载到内存中。这个字符串只被内核使用,被执行的程序没有访问它的权限。
  • 第二个是argv[0],这是程序的名字(也是)。您可以将从新程序内部看到的任何其他字符串作为argv[0]。(见下文以获得有趣的效果)
  • 第三个参数等是命令行参数,它将以argv[1]argv[2]等形式出现,直到最终的NULL值,该值向execl指示参数列表的末尾。它在程序中也被视为argv[argc],并且也等同于NULL.

因此,要调用ls,您需要使用:

代码语言:javascript
复制
execl("/bin/ls", "ls", NULL);

或者,如果你想给它传递参数:

代码语言:javascript
复制
execl("/bin/ls", "ls", "-l", "/etc/passwd", NULL);

您使用的第一个调用会给您一个错误,因为您将NULL作为程序名(argv[0])传递,第二个调用会被接受,但对ls的调用使用了错误的名称( ls内部不介意您是否更改它),并且没有命令行参数,因此它列出了目录"."

要使其有效,您可以像这样调用execl

代码语言:javascript
复制
execl("/bin/ls", "What the hell?", "badfsafds", NULL);

你应该得到:

代码语言:javascript
复制
What the hell?: badfsafds: No such file or directory

您将看到,尽管没有检查它是否被使用与加载的文件不同的名称调用,但它使用它在错误消息中声明自己。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66393208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档