cout/stdout在execvp()之后不起作用

cout/stdout not working after execvp()

本文关键字:之后 不起作用 execvp stdout cout      更新时间:2023-10-16

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

例如:

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++一起使用。

这将不适用于

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);
}