execvp()

时间:2015-11-19 00:00:54

标签: c++

所以我试图在我写的一个简短程序中使用execvp()中的unistd.h。但是由于一些奇怪的原因,我似乎在调用cout函数后失去了使用printf甚至execvp的能力。

例如,这有效:

pid_t pid;
int status;
if ((pid = fork()) > 0) {
  waitpid(pid, &status, 0);
}
else {
  execvp(argv[1], &argv[1]);
}
cout << "DONE!" << endl;

但这不起作用:

execvp(argv[1], &argv[1]);
cout << "DONE!" << endl;

而且,虽然这不是一个大问题,但我想了解它为什么会发生。当我在这里和谷歌搜索时,我找不到任何相关内容。

不确定这是否与此问题有任何关系,但我在-std=c++11使用g++标记。

1 个答案:

答案 0 :(得分:4)

这不起作用

execvp(argv[1], &argv[1]);
cout << "DONE!" << endl;

因为函数execvp()永远不会返回(如果成功)。

它用新图像替换当前进程并执行它。

另一方面有效:

if ((pid = fork()) > 0) {
  waitpid(pid, &status, 0);
}
else {
  execvp(argv[1], &argv[1]);
}
cout << "DONE!" << endl;

这里发生的是fork()创建一个新进程。所以你现在在同一个地方有两个进程。

  • 一个进程将变量pid设置为零(这是父进程)。它进入if statement的第一个分支,等待孩子完成。
  • 一个进程将变量pid设置为无零(这是子进程)。它进入第二个分支。它执行永不返回的execvp()。它不会返回,因为进程映像被另一个可执行文件替换。

注意你应该做的是:

if ((pid = fork()) > 0) {
  waitpid(pid, &status, 0);
  cout << "Child Finished!" << endl;
}
else {
  execvp(argv[1], &argv[1]);
  // This code should never execute if everything is OK.
  cout << "Child failed to start" << endl;
  exit(1);
}