阻止版本的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*()
函数时要注意的一件事是文件名中包含空格。 我有一些实际问题通过这个函数传递这样的文件名,并且必须引用它们。