c - execvp 的阻塞版本 (windows)

标签 c windows winapi exec

这题与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/

相关文章:

c - 模运算似乎不适用于所有值的 64 位值

c - GTK如何使用gtk_builder_add_from_string()

C宏生成printf格式字符串

windows - 如何在 Qt 上将 Windows 项目导入 Ubuntu?

windows - 如何从批处理文件中持久设置 Windows 7 中的变量?

c++ - MP3 的 DirectShow 媒体子类型?

c - 检查 Visual Studio C++ 编译器生成的代码,第 1 部分

Windows RT .NET 兼容性

c - 用于 Windows 7 的 C 和 win32 中的 WebSocket 客户端

c++ - 在 Win32 程序中使用 XAML 托管 API 导航到页面会导致访问冲突