Wie kann ich CMD.exe mit Pseudoconsole lebend halten, auch wenn Elternausgänge beendet sind?
Posted: 20 Feb 2025, 09:45
Ich habe server.cs , was den untergeordneten Daemon.exe wie folgt hervorbringt:
Vorbereitung für Daemon.cs :
Vorbereitung für server.cs :
Code: Select all
bool success = CreateProcess(
null,
"daemon.exe",
IntPtr.Zero,
IntPtr.Zero,
false,
DETACHED_PROCESS,
IntPtr.Zero,
null,
ref si,
out pi
);
< /code>
Innerhalb des Daemons Ich spawne einen cmd.exe wie folgt: < /p>
string app = @"C:\Windows\System32\cmd.exe";
bool success = CreateProcess(
null,
app,
IntPtr.Zero,
IntPtr.Zero,
false,
EXTENDED_STARTUPINFO_PRESENT,
IntPtr.Zero,
null,
ref si,
out pi
);
< /code>
Wenn ich Server.exe töte, wird auch cmd.exe getötet, was ich auf unbestimmte Zeit bestehen möchte. Wenn ich Daemon.exe mit so etwas wie Console.readline () breche, überlebt es den Server, der wie beabsichtigt mit detached_process beabsichtigt ist, aber aus irgendeinem Grund stirbt Cmd.exe, obwohl er von dem Daemon hervorgebracht wurde. Ich vermute, dass CMD.exe immer noch an die Konsole des Servers angeschlossen ist, aber ich weiß nicht genau und verstehe nicht, warum < /p>
es funktioniert, wenn ich cmd.exe mit Create_new_console -Flag laich, aber ich mache es Verlieren Sie die Pseudoconsole -Funktionalität, die die Ausgabe an die neue Konsole leitet.STARTUPINFOEX
Code: Select all
IntPtr lpSize = IntPtr.Zero;
InitializeProcThreadAttributeList(IntPtr.Zero, 1, 0, ref lpSize);
STARTUPINFOEX si = new();
si.lpAttributeList = Marshal.AllocHGlobal(lpSize);
InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, ref lpSize);
si.StartupInfo.cb = Marshal.SizeOf();
UpdateProcThreadAttribute(
si.lpAttributeList,
0,
(IntPtr)PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE,
phPC,
(IntPtr)Marshal.SizeOf(phPC),
IntPtr.Zero,
IntPtr.Zero
);
PROCESS_INFORMATION pi = new();
< /code>
STARTUPINFOEX
Code: Select all
STARTUPINFOEX si = new();
PROCESS_INFORMATION pi = new();