试图了解execvp的工作原理

时间:2016-07-18 23:49:30

标签: c unix execvp

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

  

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

'ls' '>' 'awd.txt'

以下是主题:What does execvp actually do?

然而,我向回答的人提出了以下问题而他没有回复,因此我不顾一切地分别要求理解它。

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

1 个答案:

答案 0 :(得分:1)

原型是:

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

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

  

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

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

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

如果你这样做:

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

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

您实际上不必将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个参数。