调用exec()或spawn(P_OVERLAY)解除对控制台的阻止;有没有办法阻止控制台?

调用exec()或spawn(P_OVERLAY)解除对控制台的阻止;有没有办法阻止控制台?,c,winapi,visual-c++,exec,spawn,C,Winapi,Visual C++,Exec,Spawn,在控制台应用程序中,将\u p_OVERLAY传递给a(与调用exec具有相同的效果),会破坏当前进程 如果不是因为这样做会导致调用进程(通常是cmd.exe)假定其被调用方已返回,那么这将是理想的行为,而实际上,该被调用方的派生子进程仍在运行,因此调用方应等待该被调用方终止,然后再继续使用控制台 因此,如果调用者是cmd.exe(命令提示符),那么一旦被调用者生成子进程,就会立即用C:\Users\user>提示符提示用户,并可以自由地键入更多命令,即使子进程仍在运行 我的最佳解决方案是避免在

在控制台应用程序中,将
\u p_OVERLAY
传递给a(与调用
exec
具有相同的效果),会破坏当前进程

如果不是因为这样做会导致调用进程(通常是
cmd.exe
)假定其被调用方已返回,那么这将是理想的行为,而实际上,该被调用方的派生子进程仍在运行,因此调用方应等待该被调用方终止,然后再继续使用控制台

因此,如果调用者是
cmd.exe
(命令提示符),那么一旦被调用者生成子进程,就会立即用
C:\Users\user>
提示符提示用户,并可以自由地键入更多命令,即使子进程仍在运行


我的最佳解决方案是避免在子进程终止之前终止当前进程,但我想知道:当被调用方终止时,有没有办法让调用进程在派生的子进程上等待,然后再继续,没有办法做到这一点-如果您希望
cmd.exe
等待您的孩子退出,那么您需要等待您的孩子退出

原因是当
cmd.exe
启动您的进程时,它会收到一个进程句柄;然后,它等待该进程句柄发出信号。大多数其他父级(例如,C运行时库)的行为方式都是相同的。当它们引用的进程退出时,进程句柄会收到信号,并且无法更改该行为


解决方法:假设您正在使用_p_OVERLAY,因为您是从UNIX代码进行移植的。如果代码太多,无法方便地将所有实例更改为在退出前等待子进程,则可以在进程启动后立即启动子进程,并在子进程中运行所有基于UNIX的代码。在这个模型中,顶级流程所做的唯一事情就是等待流程树的其余部分退出。(您可以使用作业对象跟踪流程树。)

那么,为什么不使用
exec()
?@alk:这是什么意思?这两个人的行为完全一样。问题不清楚。要等待子进程吗?或者想要控制
cmd.exe
的行为方式?您不能使用
CreateProcess
ShellExecute[Ex]
?@Ajay:两者都不能。我希望调用方(无论是谁;它可能是
cmd.exe
或其他任何东西)在继续之前等待子进程存在,即使当前进程已终止。啊,我没有测试这个。你想说
exec()
ìng也会立即显示cmd提示符吗?恐怕没有任何理由想在本机Windows代码中这样做。:-)