这个问题恰恰与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
在这种情况下不是一个好例子)甚至可能吗?
答案 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*()
函数时要注意的一件事是文件名中包含空格。我有一些实际问题通过这个函数传递这样的文件名,并且必须引用它们。