Cygwin: pty: Fix Ctrl-C handling further for non-cygwin apps.
- The recent commit: "Cygwin: pty: Fix Ctrl-C handling for non-cygwin apps in background." causes the problem that cmd.exe is terminated by Ctrl-C even if it is running in pseudo console. This patch fixes the issue.
This commit is contained in:
parent
90788821b7
commit
8d8724ee1b
|
@ -2251,7 +2251,41 @@ fhandler_pty_master::write (const void *ptr, size_t len)
|
||||||
|
|
||||||
if ((ti.c_lflag & ISIG) && memchr (buf, '\003', nlen))
|
if ((ti.c_lflag & ISIG) && memchr (buf, '\003', nlen))
|
||||||
{
|
{
|
||||||
get_ttyp ()->kill_pgrp (SIGINT);
|
/* If the process is started with CREATE_NEW_PROCESS_GROUP
|
||||||
|
flag, Ctrl-C will not be sent to that process. Therefore,
|
||||||
|
send Ctrl-break event to that process here. */
|
||||||
|
DWORD wpid = 0;
|
||||||
|
winpids pids ((DWORD) 0);
|
||||||
|
for (unsigned i = 0; i < pids.npids; i++)
|
||||||
|
{
|
||||||
|
_pinfo *p = pids[i];
|
||||||
|
if (p->ctty == get_ttyp ()->ntty
|
||||||
|
&& p->pgid == get_ttyp ()->getpgid ()
|
||||||
|
&& (p->process_state & PID_NEW_PG))
|
||||||
|
{
|
||||||
|
wpid = p->dwProcessId;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pinfo pinfo_resume = pinfo (myself->ppid);
|
||||||
|
DWORD resume_pid;
|
||||||
|
if (pinfo_resume)
|
||||||
|
resume_pid = pinfo_resume->dwProcessId;
|
||||||
|
else
|
||||||
|
resume_pid = get_console_process_id (myself->dwProcessId, false);
|
||||||
|
if (wpid && resume_pid)
|
||||||
|
{
|
||||||
|
WaitForSingleObject (pcon_mutex, INFINITE);
|
||||||
|
FreeConsole ();
|
||||||
|
AttachConsole (wpid);
|
||||||
|
/* CTRL_C_EVENT does not work for the process started with
|
||||||
|
CREATE_NEW_PROCESS_GROUP flag, so send CTRL_BREAK_EVENT
|
||||||
|
instead. */
|
||||||
|
GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, wpid);
|
||||||
|
FreeConsole ();
|
||||||
|
AttachConsole (resume_pid);
|
||||||
|
ReleaseMutex (pcon_mutex);
|
||||||
|
}
|
||||||
if (!(ti.c_lflag & NOFLSH))
|
if (!(ti.c_lflag & NOFLSH))
|
||||||
get_ttyp ()->discard_input = true;
|
get_ttyp ()->discard_input = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -274,6 +274,8 @@ enum
|
||||||
PID_NEW = 0x01000, /* Available. */
|
PID_NEW = 0x01000, /* Available. */
|
||||||
PID_ALLPIDS = 0x02000, /* used by pinfo scanner */
|
PID_ALLPIDS = 0x02000, /* used by pinfo scanner */
|
||||||
PID_PROCINFO = 0x08000, /* caller just asks for process info */
|
PID_PROCINFO = 0x08000, /* caller just asks for process info */
|
||||||
|
PID_NEW_PG = 0x10000, /* Process created with
|
||||||
|
CREATE_NEW_PROCESS_GROUOP flag */
|
||||||
PID_EXITED = 0x40000000, /* Free entry. */
|
PID_EXITED = 0x40000000, /* Free entry. */
|
||||||
PID_REAPED = 0x80000000 /* Reaped */
|
PID_REAPED = 0x80000000 /* Reaped */
|
||||||
};
|
};
|
||||||
|
|
|
@ -575,6 +575,9 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv,
|
||||||
c_flags |= CREATE_NEW_PROCESS_GROUP;
|
c_flags |= CREATE_NEW_PROCESS_GROUP;
|
||||||
refresh_cygheap ();
|
refresh_cygheap ();
|
||||||
|
|
||||||
|
if (c_flags & CREATE_NEW_PROCESS_GROUP)
|
||||||
|
myself->process_state |= PID_NEW_PG;
|
||||||
|
|
||||||
if (mode == _P_DETACH)
|
if (mode == _P_DETACH)
|
||||||
/* all set */;
|
/* all set */;
|
||||||
else if (mode != _P_OVERLAY || !my_wr_proc_pipe)
|
else if (mode != _P_OVERLAY || !my_wr_proc_pipe)
|
||||||
|
|
Loading…
Reference in New Issue