gpt4 book ai didi

Cygwin:调用 spawnvp 导致非控制台程序有一个控制台窗口

转载 作者:行者123 更新时间:2023-12-01 15:05:23 25 4
gpt4 key购买 nike

这是一个在 Windows 7 下使用 Cygwin 2.5.2 重现该行为的小程序。

#include <windows.h>
#include <process.h>

int main(void)
{
const char * const argv[] = {
"c:/Windows/System32/notepad.exe",
0
};

Sleep(5000);
return spawnvp(_P_WAIT, argv[0], argv);
}

构建如下:

$ gcc -mwindows spawn.c -o spawn

好处:正确的是,这个程序不以控制台窗口启动。我们可以使用 Windows 资源管理器导航到它的目录并启动它。当程序开始执行并到达 Sleep(5000) 语句时,屏幕上什么也没有出现。

缺点:五秒后,spawnvp 调用被执行,程序得到一个控制台窗口!记事本启动,其窗口显示在此控制台窗口的顶部。

有人可以解释原因,以及如何解决这个问题吗?只有记事本应该显示,而不是任何虚假的控制台窗口。

当然,如果我们生成一个控制台程序,那个程序应该有自己的控制台窗口。这不是这里的问题; parent 正在获取不需要的窗口(并且 child 根本不是控制台程序)。

更新:我现在正在重建 Cygwin,希望能够将一些调试打印语句添加到 spawn* 函数下面的复杂内容中,看看在哪个点窗口出现。

最佳答案

我查到了这个。所有 Cygwin spawn*exec* 调用都通过依赖于 child_info_spawn::worker 类成员函数的 spawne,在 winsup/cygwin/spawn.cc 中实现。

此函数包含以下内容:

  if (mode == _P_DETACH)
c_flags |= DETACHED_PROCESS;
else
fhandler_console::need_invisible ();

罪魁祸首是对分配控制台的 fhandler_console::need_invisible 的调用。出于某种原因,Cygwin 认为如果调用应用程序还没有一个不可见的控制台窗口,则需要创建一个。不幸的是,创建这个隐形窗口的计划并没有按计划进行;我们得到一个可见的窗口。

如果我注释掉对 need_invisible 的调用并重建 Cygwin DLL,问题就会消失。

关于Cygwin:调用 spawnvp 导致非控制台程序有一个控制台窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38108333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com