4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-02-21 00:07:36 +08:00

Cygwin: pinfo: Fix exit code for non-cygwin apps which reads console.

- The recent commit "Cygwin: pinfo: Fix exit code when non-cygwin app
  exits by Ctrl-C." did not fix enough the issue. If a non-cygwin app
  is reading the console, it will not return STATUS_CONTROL_C_EXIT
  even if it is terminated by Ctrl-C. As a result, the previous patch
  does not take effect.
  This patch solves this issue by setting sigExeced to SIGINT in
  ctrl_c_handler(). In addition, sigExeced will be cleared if the app
  does not terminated within predetermined time period. The reason is
  that the app does not seem to be terminated by the signal sigExeced.
This commit is contained in:
Takashi Yano 2022-02-26 15:13:13 +09:00
parent 15a35758d8
commit f6db6f52ae
3 changed files with 20 additions and 3 deletions

View File

@ -1139,7 +1139,11 @@ ctrl_c_handler (DWORD type)
}
if (ch_spawn.set_saw_ctrl_c ())
return TRUE;
{
if (myself->process_state & PID_NOTCYGWIN)
sigExeced = SIGINT;
return TRUE;
}
/* We're only the process group leader when we have a valid pinfo structure.
If we don't have one, then the parent "stub" will handle the signal. */

View File

@ -20,7 +20,7 @@ HANDLE NO_COPY hProcImpToken;
HANDLE my_wr_proc_pipe;
HMODULE NO_COPY cygwin_hmodule;
HMODULE NO_COPY hntdll;
int NO_COPY sigExeced;
LONG NO_COPY sigExeced;
WCHAR windows_system_directory[MAX_PATH];
UINT windows_system_directory_length;
WCHAR system_wow64_directory[MAX_PATH];

View File

@ -953,7 +953,15 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv,
if (sem)
__posix_spawn_sem_release (sem, 0);
if (ptys_need_cleanup || cons_need_cleanup)
WaitForSingleObject (pi.hProcess, INFINITE);
{
LONG prev_sigExeced = sigExeced;
while (WaitForSingleObject (pi.hProcess, 100) == WAIT_TIMEOUT)
/* If child process does not exit in predetermined time
period, the process does not seem to be terminated by
the signal sigExeced. Therefore, clear sigExeced here. */
prev_sigExeced =
InterlockedCompareExchange (&sigExeced, 0, prev_sigExeced);
}
if (ptys_need_cleanup)
{
fhandler_pty_slave::cleanup_for_non_cygwin_app (&ptys_handle_set,
@ -966,6 +974,11 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv,
fhandler_console::cleanup_for_non_cygwin_app (&cons_handle_set);
fhandler_console::close_handle_set (&cons_handle_set);
}
/* Make sure that ctrl_c_handler() is not on going. Calling
init_console_handler(false) locks until returning from
ctrl_c_handler(). This insures that setting sigExeced
on Ctrl-C key has been completed. */
init_console_handler (false);
myself.exit (EXITCODE_NOSET);
break;
case _P_WAIT: