为什么命令
execl("/bin/ls", NULL);
返回使用错误,而命令
execl("/bin/ls", "badfsafds", NULL);
在一个简单的 C 程序中返回目录中的文件列表?
我知道execl的第一个参数是路径指定,但我以为只是路径指定,而不是命令执行。谢谢。
最佳答案
第一个参数指定路径,对。
第二个和后续参数给出传递给程序的参数,例如作为 main()
的 argv
参数,以 argv[0]
开头。
因此,您的第一个示例导致 ls
使用空的 argv
vector 运行,其中 argv[0]
为 NULL。大多数程序假定 argv[0]
将是一个有效的字符串,它以某种形式指定程序的名称,如果它为 NULL,它们将崩溃或无法工作。因此你不应该这样做。
您的第二个示例导致 ls
在 argv[0]
设置为 "badfsafds"
且没有其他参数的情况下运行。 argv[0]
的异常值在很大程度上可能不会影响其行为。但是例如,如果它给出一条错误消息,比如说如果您在没有读取权限的目录中运行它,它将包含给定的 argv[0]
并报告类似 badfsafds:无法打开目录“.”:权限被拒绝
。除此之外,它的工作方式与您从 shell 不带参数运行 ls
时的任何其他时间一样,并列出当前目录。
(有些程序会根据 argv[0]
的值改变它们的行为。例如,在我的系统 cal
和 ncal
是指向同一可执行文件的符号链接(symbolic link)。此可执行文件查看其 argv[0]
以确定其运行方式,并取决于它是否看到 cal
或 ncal
它会相应地调整它的输出格式。但我不认为 ls
有任何这样的行为。)
https://stackoverflow.com/questions/66393208/