C++ execvp()后不能/无法工作

C++ execvp()后不能/无法工作,c++,C++,因此,我试图在我正在编写的一个简短程序中使用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!"

因此,我试图在我正在编写的一个简短程序中使用
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;
if ((pid = fork()) > 0) {
  waitpid(pid, &status, 0);
}
else {
  execvp(argv[1], &argv[1]);
}
cout << "DONE!" << endl;
pid\u t pid;
智力状态;
如果((pid=fork())>0){
waitpid(pid和status,0);
}
否则{
execvp(argv[1],&argv[1]);
}
这行不通

execvp(argv[1], &argv[1]);
cout << "DONE!" << endl;
这里发生的是
fork()
创建了一个新的进程。现在在同一个地方有两个进程

  • 一个进程将变量
    pid
    设置为零(这是父进程)。它进入
    if语句的第一个分支,然后等待子语句完成
  • 一个进程将变量
    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);
}
if((pid=fork())>0){
waitpid(pid和status,0);
这行不通

execvp(argv[1], &argv[1]);
cout << "DONE!" << endl;
这里发生的是
fork()
创建了一个新的进程。因此,您现在有两个进程位于完全相同的位置

  • 一个进程将变量
    pid
    设置为零(这是父进程)。它进入
    if语句的第一个分支,然后等待子进程完成
  • 一个进程将变量
    pid
    设置为none-zero(这是子进程)。它进入第二个分支。它执行
    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);
}
if((pid=fork())>0){
waitpid(pid和status,0);

所以我必须用第一种方法执行吗?
execvp()
在运行新程序失败时将返回,因此“永不返回”不是真的。@IanLantzy我们不知道你想做什么,所以我不确定你认为我们可以如何回答这个问题。@IanLantzy:你是想用另一个进程替换当前进程。还是想启动一个子进程来完成一项任务,然后在子进程完成后返回原始进程?我只是想理解d为什么会发生这种情况。这是一个有效的问题,一旦它允许我回答,我就会接受这个答案,因为它解释得很好。所以我必须先用第一种方法来做。当它无法运行新程序时,
execvp()
将返回,因此“永不返回”不是真的。@IanLantzy我们不知道你想做什么,所以我不确定你认为我们可以如何回答这个问题。@IanLantzy:你是想用另一个进程替换当前进程。还是想启动一个子进程来完成一项任务,然后在子进程完成后返回原始进程?我只是想理解d为什么会发生这样的事情。这是一个有效的问题,一旦它让我知道了,我会接受这个答案,因为它解释得很好。你完全明白什么是
execvp
吗?而且,如果不告诉我们你实际上在做什么,告诉我们什么有效什么无效也没有多大帮助。在某种程度上,是的。但是它是在我的CISC361课程中只做了非常简单的介绍。你完全理解
execvp
的功能吗?而且,如果不告诉我们你实际上在做什么,告诉我们什么有效,什么无效也没有什么帮助。在某种程度上是的。但是在我的CISC361课程中只做了非常简单的介绍。