【发布时间】:2016-07-18 23:49:29
【问题描述】:
我在execvp 上找到了很多解释和答案,但这一切似乎都令人困惑。 execvp 接受一个命令并将其发送到内核然后执行一些操作,execvp 创建一个映像,execvp 是系统调用,execvp ...等等。作为一个 C 语言和 Linux 经验有限的初学者,似乎只有以下explanation 为我点击:
它使用 2 个参数执行
ls:>和awd.txt。相当于运行:'ls' '>' 'awd.txt'
这里是线程:What does execvp actually do?
但是,我向回答的人提出了以下问题,他没有回答,因此我单独询问以拼命试图理解它。
所以要在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的命令?
【问题讨论】:
-
要执行
ls -a,你需要:char *args[] = { "ls", "-a", 0 };,其中尾随空指针(写成0——如果你愿意,可以是NULL)是至关重要的。它标志着参数列表的结束,就像在main()程序中的argv中一样。假设给定的名称很简单(没有斜杠),它所做的是查找在PATH环境变量中命名的目录,并将目录与可执行文件名称连接起来并尝试execv(pathname, args)。如果成功了,就没有机会了;如果失败,它会尝试PATH上的下一个目录,直到成功或没有任何剩余。