我希望能够像wget -b
一样从控制台分离我的程序。代码片段可能看起来像
static void Main(string[] args)
{
var settings = new Settings(args);
if (settings.Background)
{
/*Tell the user what's going on.*/
System.Console.WriteLine("Detatching from console. The program will still be running.");
System.Console.Out.Close();
}
/*do work then exit.*/
}
但是System.Console.Out.Close();
没有做正确的事。
澄清一下,“正确的事情”是,当从控制台运行此程序时,应该重新出现提示。或者,从explorer.exe
运行此程序时,控制台窗口应该关闭。
如果我不清楚,请告诉我。
答案 0 :(得分:1)
为任何运行的控制台应用程序打开3个通道:STDIN,STDOUT,STDERR。传统上,所有3个都需要关闭才能让应用程序释放控制台。
在Windows中,似乎有一种API方法:FreeConsole ...和pinvoke.net。
编辑:另一篇SO帖子说没有开始后台流程是不可能的:How to make a windowless / command-line application return but continue executing in background? ...在Unix中,fork();
就足够了。
答案 1 :(得分:1)
您所引用的wget
的来源可用here。您会注意到在mswindows.c第193-314行中,实现了一个fork过程。它们生成wget
的新实例并将相同的参数传递给它。
这些评论也很有用:
Windows不支持fork()调用;所以我们通过调用我们被调用的相同参数的另一个Wget副本来伪造它。
在第102行:
在Windows 9x下,如果我们是从16位进程启动的......父进程应立即恢复。在NT ...这是一个徒劳的姿态,因为父母将等待我们终止,然后才能恢复。
简短的回答似乎是“不要这样做。”
答案 2 :(得分:1)
您可以通过创建使用FreeConsole的普通Windows应用程序(无需使用GUI)来获取您想要的内容,而不是创建控制台应用程序,然后调用AllocConsole。 {}} / AttachConsole根据需要。
这样你就有了一个可以在后台运行的应用程序,但可以根据需要显示和隐藏控制台窗口。虽然据我所知,这些控制台窗口和普通的Windows命令提示之间存在一些差异,因此它可能无法满足您的需求。
答案 3 :(得分:0)
澄清一下,“正确的事情”是,当从控制台运行此程序时,应该重新出现提示。或者,当从explorer.exe运行此程序时,控制台窗口应该关闭。
这不是你想要“控制台窗口[关闭]”,你希望它不存在。有一种非常简单的方法可以获得你想要的东西:不要构建一个控制台应用程序。 : - )
如果从命令行构建,请使用CSC /target:winexe ...
。这将创建一个永远不会与任何命令行关联的Windows程序。