这题与Non-blocking version of system()正好相反
我想用另一个进程替换当前进程(而不是创建另一个进程)。
我想启动(例如)notepad
,但是以阻塞方式(我不想在 notepad
关闭之前得到提示。
在 Windows shell 中我只是这样做
cmd /c notepad
(notepad
如果没有 cmd/c
前缀,则自动从提示中分离)
在 C 中,使用 system
我只是这样做
system("notepad");
但这是在幕后 fork 。我想用记事本
替换当前进程,并且我希望它是阻塞的。
我试过:
#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 个进程)
有可能吗?
最佳答案
您并不清楚您想要什么 - 如果当前进程通过 execv*()
函数被子可执行文件替换,则它不能等待子进程.
一个可能的 system()
替换 - 在 Windows 上 - 是 _spawnvp()
:
intptr_t _spawnvp(
int mode,
const char *cmdname,
const char *const *argv
);
就用
int rc = _spawnvp( _P_WAIT, command, args );
(我怀疑这个确切功能在 POSIX 系统上不可用的原因是它很容易在 POSIX 上通过 fork()
、exec*()
和wait()
的变体。Windows 等价物稍微复杂一些。)
使用 Windows _spawn*()
函数时要注意的一件事是文件名中包含空格。我在通过此函数传递此类文件名时遇到了一些实际问题,不得不引用它们。
关于c - execvp 的阻塞版本 (windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49736973/