ClosePseudoConsole() leaves lingering conhost.exe processes #5684

Closed
opened 2026-01-31 00:19:12 +00:00 by claunia · 3 comments
Owner

Originally created by @krayon007 on GitHub (Dec 24, 2019).

Environment

Windows build number: 10.0.18362.535
Windows Terminal version (if applicable):

Any other software?

Steps to reproduce

Create PseudoConsole. then associate it with child process (cmd.exe).
Spawn thread to read the output pipe.
At this point, everything about the PseudoConsole appears to work fine. However, when you call ClosePseudoConsole() on the PsuedoConsole handle, it correctly closes the child process, however conhost.exe lingers until the parent process is terminated... If you do this dozens of times, there will be dozens of conhost.exe processes running.

When the child process is terminated, by ClosePseudoConsole(), it does not break the communication pipe. (ie ReadFile does not return). When the process handle for cmd.exe is signaled, I called CancelIoEx() on the pipes, then closed the pipes. This does not seem to have any effect on cleaning up the conhost.exe processes that are lingering. If I spawn dozens of PseudoConsoles in this fashion, and close them in this fashion, only the cmd.exe processes are destroyed. There are still dozens of conhost.exe processes lingering, until the parent process is terminated.

Expected behavior

When calling ClosePseudoConsole(), I expected either a final data frame to be received on the pipe, or the pipe to break when the child process exits. I also expected the conhost.exe process to be destroyed along side the cmd.exe process.

Actual behavior

When calling ClosePseudoConsole(), the cmd.exe process is cleaned up, but the conhost.exe process stays resident until the parent process is terminated.

Originally created by @krayon007 on GitHub (Dec 24, 2019). <!-- 🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨 I ACKNOWLEDGE THE FOLLOWING BEFORE PROCEEDING: 1. If I delete this entire template and go my own path, the core team may close my issue without further explanation or engagement. 2. If I list multiple bugs/concerns in this one issue, the core team may close my issue without further explanation or engagement. 3. If I write an issue that has many duplicates, the core team may close my issue without further explanation or engagement (and without necessarily spending time to find the exact duplicate ID number). 4. If I leave the title incomplete when filing the issue, the core team may close my issue without further explanation or engagement. 5. If I file something completely blank in the body, the core team may close my issue without further explanation or engagement. All good? Then proceed! --> <!-- This bug tracker is monitored by Windows Terminal development team and other technical folks. **Important: When reporting BSODs or security issues, DO NOT attach memory dumps, logs, or traces to Github issues**. Instead, send dumps/traces to secure@microsoft.com, referencing this GitHub issue. If this is an application crash, please also provide a Feedback Hub submission link so we can find your diagnostic data on the backend. Use the category "Apps > Windows Terminal (Preview)" and choose "Share My Feedback" after submission to get the link. Please use this form and describe your issue, concisely but precisely, with as much detail as possible. --> # Environment ```none Windows build number: 10.0.18362.535 Windows Terminal version (if applicable): Any other software? ``` # Steps to reproduce <!-- A description of how to trigger this bug. --> Create PseudoConsole. then associate it with child process (cmd.exe). Spawn thread to read the output pipe. At this point, everything about the PseudoConsole appears to work fine. However, when you call ClosePseudoConsole() on the PsuedoConsole handle, it correctly closes the child process, however conhost.exe lingers until the parent process is terminated... If you do this dozens of times, there will be dozens of conhost.exe processes running. When the child process is terminated, by ClosePseudoConsole(), it does not break the communication pipe. (ie ReadFile does not return). When the process handle for cmd.exe is signaled, I called CancelIoEx() on the pipes, then closed the pipes. This does not seem to have any effect on cleaning up the conhost.exe processes that are lingering. If I spawn dozens of PseudoConsoles in this fashion, and close them in this fashion, only the cmd.exe processes are destroyed. There are still dozens of conhost.exe processes lingering, until the parent process is terminated. # Expected behavior <!-- A description of what you're expecting, possibly containing screenshots or reference material. --> When calling ClosePseudoConsole(), I expected either a final data frame to be received on the pipe, or the pipe to break when the child process exits. I also expected the conhost.exe process to be destroyed along side the cmd.exe process. # Actual behavior <!-- What's actually happening? --> When calling ClosePseudoConsole(), the cmd.exe process is cleaned up, but the conhost.exe process stays resident until the parent process is terminated.
claunia added the Resolution-DuplicateProduct-Conpty labels 2026-01-31 00:19:13 +00:00
Author
Owner

@miniksa commented on GitHub (Jan 2, 2020):

This is going to be related to #1810.

@miniksa commented on GitHub (Jan 2, 2020): This is going to be related to #1810.
Author
Owner

@miniksa commented on GitHub (Jan 2, 2020):

/dup #1810

@miniksa commented on GitHub (Jan 2, 2020): /dup #1810
Author
Owner

@ghost commented on GitHub (Jan 2, 2020):

Hi! We've identified this issue as a duplicate of another one that already exists on this Issue Tracker. This specific instance is being closed in favor of tracking the concern over on the referenced thread. Thanks for your report!

@ghost commented on GitHub (Jan 2, 2020): Hi! We've identified this issue as a duplicate of another one that already exists on this Issue Tracker. This specific instance is being closed in favor of tracking the concern over on the referenced thread. Thanks for your report!
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/terminal#5684