阻止版本的execvp(windows)

时间:2018-04-09 15:53:59

标签: c windows winapi exec

这个问题恰恰与Non-blocking version of system()

完全相反

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

我想开始(例如)notepad,但是以阻止的方式(我不想在notepad关闭之前得到提示。

在Windows shell中我只是做

cmd /c notepad

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

在C中,使用system我只是做

system("notepad");

但这是在幕后分手。我想通过notepad 替换当前流程,我希望它能够阻止。

我试过了:

#include <stdio.h>
#include <unistd.h>

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个流程)

甚至可能吗?

1 个答案:

答案 0 :(得分:3)

目前还不清楚你想要什么 - 如果子进程通过execv*()函数替换,当前进程不能等待子进程。

Windows上可能的system()替代品是_spawnvp()

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

只需使用

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

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

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