我在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
?
答案 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个参数。