【发布时间】:2015-09-16 10:47:02
【问题描述】:
所以根据我自己的发现,我知道我将需要使用fork() 和execvp(),但我无法从任何在线示例中完全弄清楚如何正确使用execvp()。它应该让我基本上运行命令行的东西,但我不明白它需要的参数。就像我想运行ls -a 一样,我将如何将其放入execvp()?然后是exec() 不返回的问题。我该如何处理?
【问题讨论】:
所以根据我自己的发现,我知道我将需要使用fork() 和execvp(),但我无法从任何在线示例中完全弄清楚如何正确使用execvp()。它应该让我基本上运行命令行的东西,但我不明白它需要的参数。就像我想运行ls -a 一样,我将如何将其放入execvp()?然后是exec() 不返回的问题。我该如何处理?
【问题讨论】:
首先,exec() 不会返回,因为它会导致进程将它执行的程序替换为 exec()ed 的任何程序。也就是说,如果您在fork() 之后通过exec() 运行ls,则ls 的PID 将与调用exec() 的PID 相同。那就是exec() 不会创建一个新进程,所以它不能返回,因为调用它的程序中的所有内存和代码实际上都已经消失了,取而代之的是exec()ed
运行ls -a 和execvp() 假设ls 在/bin 中
const char *file = "/bin/ls";
const char *arg1 = "ls";
const char *arg2 = "-a";
const char **argv = {arg1, arg2, NULL};
execvp(file, argv);
【讨论】:
execvp()的返回值应该从main()返回。
execvp() 失败,否则它根本不会返回,仅此而已。无论我们如何处理返回值,父进程都将能够获取exec()d 程序的退出值,因为如果成功则不会返回。明智的错误处理我们可以做任何我们想做的事情并返回我们选择的任何退出代码。或者我们可以使用某种 IPC 来告诉我们的父母我们失败了,不管怎样。
execvp() 的工作原理,而不是试图解决整个问题,因为这正是问题所在。
*file 将永远是“/bin/NULL 添加到argv?其余的我想我明白了