【问题标题】:Start new process, without being a child of the spawning process启动新进程,而不是生成进程的子进程
【发布时间】:2012-01-16 02:09:01
【问题描述】:

如果不是调用进程的子进程,我将如何开始一个新进程。

例子:

主程序(Caller.exe)

process.start("file.exe")

图片:

【问题讨论】:

  • 只是好奇,它是子进程而不是父进程的含义是什么?
  • 如果用户在任务管理器中选择“杀死进程树”,我的整个应用程序不会死。
  • 闻起来还是像XY problem。新进程不是当前进程的子进程或规避“杀死进程树”的真正意义是什么?

标签: c# vb.net process parent-child


【解决方案1】:

如果生成进程(父进程)在生成进程(子进程)之前结束,则父子链中断。要利用这一点,您必须像这样使用中间存根进程:

Caller.exe → Stub.exe → File.exe。

这里的 Stub.exe 是一个简单的启动程序,在启动 File.exe 后就结束了。

【讨论】:

  • 非常感谢。我要使用这个解决方案
  • 谢谢你。我最终遇到了一个奇怪的情况,我有一个浏览器渲染一个 Java 小程序,它调用了一个 exe 应用程序,该应用程序又通过Webbrowser 控件渲染了一个嵌入式 IE 组件,以及在该组件中运行的目标第三方黑盒类型网页一直挂起,直到父浏览器重新获得焦点或被终止。从 Java 中删除 .exe 应用程序完全解决了这个问题。
  • 无法再使用Process.GetProcesses()检索分离的程序?
【解决方案2】:

如果你启动一个进程,那么你就是它的父进程。

也许您可以尝试从 cmd.exe 启动您的进程,因此 cmd.exe 将是父进程。

Process proc = Process.Start(new ProcessStartInfo { Arguments = "/C explorer", FileName = "cmd", WindowStyle = ProcessWindowStyle.Hidden });

【讨论】:

  • 我要试一试。我会回帖。谢谢
  • 我突然想到,如果用户禁用了命令提示符,这将不起作用。除此之外,这将是一个很好的解决方案。
  • 它不起作用,因为 cmd 仅在启动的进程死亡后才会死亡,因此不会破坏父子关系。
  • @Svisstack 除非您使用start 从 cmd 启动进程?
【解决方案3】:

这会在没有父进程的情况下运行新进程:

System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo();
psi.FileName = @"cmd";
psi.Arguments = "/C start notepad.exe";
psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
System.Diagnostics.Process.Start(psi);

【讨论】:

  • 这不是真的 - 它永远是一个子进程。
  • @AK_ 不,它没有。刚刚检查了 ProcessExplorer。
  • 同@AK_,这对我不起作用,当我杀死父应用程序时,通过“cmd”技巧启动的进程仍然被杀死。
【解决方案4】:

我一直在尝试启动一个更新进程,该进程会删除调用进程的文件并用新文件替换它们。通过设置UseShellExecute = true,我能够在调用进程退出时规避生成的进程退出。

这是在使用 WPF 的 .Net Core 3.0 应用程序中。

var startInfo = new ProcessStartInfo("Updater.exe");
startInfo.UseShellExecute = true;
Process.Start(startInfo);
Environment.Exit(0);

【讨论】:

  • 这应该是公认的答案。它也适用于 .net 5。
【解决方案5】:

Process.Start(string fileName) 的文档说

a new process that’s started alongside already running instances 
of the same process will be independent

它说

Starting a process by specifying its file name is similar to 
typing the information in the Run dialog box of the Windows Start menu

在我看来,这与独立流程一致。

所以根据文档,Process.Start 应该做你想做的事。

【讨论】:

  • 但是,我遇到了这个问题,因为它想产生一个独立的子进程,但它是通过Process.Start 独立产生的。然后我尝试在一个简单的测试项目中隔离行为,我得出结论Process.Start 确实独立启动了该过程。这让我怀疑还有其他东西会影响 Process.Start 的行为
【解决方案6】:

这是我现在使用的代码。我认为它可能对某人有用。它接受一个论点。该参数是一个 base64 编码的字符串,它解码为您要运行的文件的路径。

 Module Module1

    Sub Main()
        Dim CommandLineArgs As System.Collections.ObjectModel.ReadOnlyCollection(Of String) = My.Application.CommandLineArgs
        If CommandLineArgs.Count = 1 Then
            Try
                Dim path As String = FromBase64(CommandLineArgs(0))
                Diagnostics.Process.Start(path)
            Catch
            End Try
            End
        End If
    End Sub

    Function FromBase64(ByVal base64 As String) As String
        Dim b As Byte() = Convert.FromBase64String(base64)
        Return System.Text.Encoding.UTF8.GetString(b)
    End Function

End Module

【讨论】:

  • 您的 OP 对 base64 编码只字未提,WTF?
  • 这个答案已经 6 年了,如果我不记得这里的所有细节,请原谅我。我相信参数的 base64 解码是试图从输入文件的路径中去除不需要的字符。输入路径显然需要在与此代码一起使用之前进行 base64 编码。同样,这是 6 岁,所以我不确定这是否是我当时所追求的。这样做可能有更好的方法,但在撰写本文时我还是个新手。
猜你喜欢
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多