c - execl参数混淆

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

我知道execl的第一个参数是路径指定,但我以为只是路径指定,而不是命令执行。谢谢。

最佳答案

第一个参数指定路径,对。

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

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

您的第二个示例导致 lsargv[0] 设置为 "badfsafds" 且没有其他参数的情况下运行。 argv[0] 的异常值在很大程度上可能不会影响其行为。但是例如,如果它给出一条错误消息,比如说如果您在没有读取权限的目录中运行它,它将包含给定的 argv[0] 并报告类似 badfsafds:无法打开目录“.”:权限被拒绝。除此之外,它的工作方式与您从 shell 不带参数运行 ls 时的任何其他时间一样,并列出当前目录。

(有些程序会根据 argv[0] 的值改变它们的行为。例如,在我的系统 calncal是指向同一可执行文件的符号链接(symbolic link)。此可执行文件查看其 argv[0] 以确定其运行方式,并取决于它是否看到 calncal 它会相应地调整它的输出格式。但我不认为 ls 有任何这样的行为。)

https://stackoverflow.com/questions/66393208/

相关文章:

javascript - 翻转所有卡片,但想一张一张地翻转

unity3d - 有没有办法在着色器中合并 Unity 中的纹理?

javascript - 如何在 NEXT JS 中的路由之间传递状态?

java - 追加java静态变量

aws-lambda - 使用排序键删除 DynamoDb

c++ - 如何将 Arduino 的模拟输入读数从草图转换为 .WAV

r - 在列标题和成对变量中嵌入数据的数据透视表

javascript - 如何将共享一个公共(public)键的两个对象的两个值合并在一起并返回它?

java - 如何使用流将映射值聚合到集合中

c++ - SFINAE 无法正确判断方法是否存在