gpt4 book ai didi

c - 尝试了解 execvp 的工作原理

转载 作者:行者123 更新时间:2023-11-30 15:07:09 27 4
gpt4 key购买 nike

我在 execvp 上找到了很多解释和答案但这一切似乎令人困惑。 execvp接受一个命令并将其发送到内核,然后执行某些操作,execvp创建图像,execvp是系统调用,execvp ...ETC。作为一个C语言和Linux经验有限的初学者,只有以下explanation似乎很适合我:

It's executing ls with 2 arguments: > and awd.txt. It is equivalent to running:

'ls' '>' 'awd.txt'

这是线程:What does execvp actually do?

但是,我向回答者提出了以下问题,但他没有回答,因此我单独询问,拼命试图理解它。

所以要执行ls -aexecvp ,我们应该做execvp ("ls", args) ;哪里args{"ls", "-a"} ?或execvp (args[0], args)

谁能告诉我这是否属实:execvp从数组 args 中获取第一个参数然后将其发送到内核以遵循以下数组参数?所以execvp(args[0],args);就是 args [] = {"ls", "-a"}数组 args[0]需要ls ,将其发送到内核,然后呢?它会寻找另一个 args[0]并发现-a并发送该信息,内核确定这两个命令发出了类似 ls -a 的命令?

最佳答案

原型(prototype)是:

  int execvp(const char *file, char *const argv[]);

第一个参数,file 是要执行的程序的名称。 execvp 将搜索您的路径并尝试找到匹配项。从联机帮助页:

The execlp(), execvp(), and execvpe() functions duplicate the actions of the shell in searching for an executable file if the specified file name does not contain a slash (/) character.
The file is sought in the colon-separated list of directory pathnames specified in the PATH environment variable.

如果/当 execvp 找到匹配项时,该程序将被加载到内存中并替换当前正在运行的程序。

新程序将看到的参数是 execvp 中指定的 argv 数组。您应该将空指针作为最后一个元素,否则您的程序可能会因寻找空值而崩溃。

如果你这样做:

char *argv[]={"bar","bash","penguin",0};
execvp("foo",argv);

那么当 foo 启动时,它将具有与当前程序相同的环境,其 argc 将是 3,其 argv 将是上面的列表。即使程序名称是“foo”,它的argv[0]在运行时也会显示为“bar”。

实际上您不必将 argv[0] 作为新程序的名称。这是预期的,但不是必需的。

顺便说一句,以你的例子

ls > awd.txt

如果您在命令行上执行此操作,您的 shell 将 fork 创建自身的新副本。子 shell 将打开 awd.txt 并执行 dup2() 将附加到 awd.txt 的子 fd 设置为 1。在进行其他一些处理后,子 shell 将执行类似的操作。

execvp("ls", {"ls", 0})

所以在创建的“ls”中argc==1和argv[1]==0。传统上,我们会说 ls 有 0 个参数。

关于c - 尝试了解 execvp 的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38447544/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com