试图了解execvp如何工作

我在execvp上发现了很多解释和答案,但这一切似乎都令人困惑。 execvp接收命令并将其发送给内核,然后执行某些操作, execvp创build映像, execvp是系统调用, execvp等等。 作为C语言和Linux经验有限的初学者,只有下面的解释似乎点击了我:

它使用两个参数执行ls>awd.txt 。 这相当于运行:

 'ls' '>' 'awd.txt' 

这里是线程: execvp实际上做了什么?

但是,我向接受答复的人问了下面的问题,他没有回答,因此我正在拼命地试图了解这个问题。

所以要在execvp执行ls -a ,我们应该执行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

原型是:

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

第一个参数, file是要执行的程序的名称。 execvp会搜索你的路径,并尝试找到一个匹配。 从手册:

如果指定的文件名不包含斜杠(/)字符,则execlp(),execvp()和execvpe()函数将重复执行shell搜索可执行文件的操作。
该文件是在PATH环境变量中指定的以冒号分隔的目录路径名列表中查找的。

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

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

如果你这样做:

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

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

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

顺便说一下,用你的例子

 ls > awd.txt 

如果你在命令行上这样做了,你的shell将创建一个新的副本。 子shell将打开awd.txt并执行dup2()将附加到awd.txt的子fd设置为1.经过其他一些管理之后,子shell将执行类似的操作。

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

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