阻止版本的execvp(windows)

这个问题与系统的非阻塞版本完全相反()

我想用另一个替换当前进程(不创建另一个进程)。

我想开始(例如) notepad ,但是以阻塞的方式(我不希望得到提示,直到notepad关闭。

在Windows shell中我只是这样做

 cmd /c notepad 

(如果没有以cmd /c为前缀,则notepad自动从提示中分离)

在C中,使用system我就是这么做的

 system("notepad"); 

但这是在幕后分手。 我想用notepad 替换当前进程,我希望它是阻塞的。

我试过了:

 #include  #include  int main(int argc,char **argv) { char * const args[] = {"cmd","/c","notepad",NULL}; execvp(args[0],args); } 

notepad运行,但控制台立即返回提示。(非阻塞)。 我希望它阻止,我不想使用fork因为它会创建另一个进程:我想替换当前进程。

(我尝试过使用自定义阻塞可执行文件,它也不会阻塞。所以cmd /c notepad示例和其他任何一个一样好)

所以,如果我运行这个可执行文件,我只是从父进程构建:

  • notepad进程退出之前,我不希望进程返回到父进程
  • 我希望能够从命令中获得输出( notepad在这种情况下不是一个好例子)
  • 我不想创建额外的进程(这是一个大型多处理应用程序的一部分,我们不能创建2个进程,我们需要为每次运行保留1个进程)

它甚至可能吗?

它并不完全清楚你想要什么 – 当前进程不能等待子进程,如果它execv*()通过execv*()函数替换

在Windows上可能的system()替换是_spawnvp()

 intptr_t _spawnvp( int mode, const char *cmdname, const char *const *argv ); 

只是用

 int rc = _spawnvp( _P_WAIT, command, args ); 

(我怀疑POSIX系统上没有这个确切function的原因是它可以通过fork()exec*()wait()的变体在POSIX上轻松实现.Windows等价物有点复杂。 )

使用Windows _spawn*()函数时要注意的一件事是文件名中包含空格。 我有一些实际问题通过这个函数传递这样的文件名,并且必须引用它们。