父进程崩溃后的 C# 子进程行为

C# child process behaviour after parent crash

我有一个简单而有趣的问题。

我需要从 C# 应用程序启动一个进程(node.js 服务器)。

我找到了一段解释如何从应用程序中启动服务器的代码。

 Process p = new Process();
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardError = true;
        p.StartInfo.RedirectStandardInput = true;
        p.StartInfo.FileName = @"c:\node\node.exe";**//Path to node installed folder****
        string argument = "\ bundle\main.js";
        p.StartInfo.Arguments = @argument;
        p.Start();

我的问题是:如果父进程(C# 应用程序)崩溃,此进程会发生什么情况?子进程会 exit/crash 还是会保留 运行 因为它是一个完全独立的程序?

在它保持 运行 的情况下,有没有办法 "link" 这两个进程确保在父进程崩溃时子进程退出?

试过你的代码如下,如果你想关闭你的进程,你必须使用这个函数process.CloseMainWindow();这将关闭你启动的进程。

public static void Main()
{    
     System.Diagnostics.Process process = new System.Diagnostics.Process();
     System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
    startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
     startInfo.FileName = "cmd.exe";
     process.StartInfo = startInfo;
     process.Start();
     Console.ReadLine();
     process.CloseMainWindow();
     process.Close();
}

在上面的代码中,我启动了 cmd.exe,因为它有自己的 window,我编写了 CloseMainWindow() 函数来关闭该程序。

因为 Cmd 是一个独立的进程,当您关闭启动它的程序时它不会关闭。

如果父进程崩溃(在 process.CloseMainWindow(); 之前),这个进程会保持 运行ning 吗?

问题的答案是:如果父进程在调用 CloseMainWindow 之前关闭,Cmd 进程将不会关闭

试试这个来检查它

public static void Main()
    {
        System.Diagnostics.Process process = new System.Diagnostics.Process();
        System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
        startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
        startInfo.FileName = "cmd.exe";
        process.StartInfo = startInfo;
        process.Start();
        throw new Exception("test");
        Console.ReadLine();
        process.CloseMainWindow();
        process.Close();
}

在上面的代码中,主程序出现异常,它是在关闭子进程之前创建的,那么在这种情况下,子进程将 运行.

如果你想在应用程序关闭时强行关闭外部启动的进程,而不是使用Application.ApplicationExit Event,并调用外部进程对象的CloseMainWindow()函数。