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