Req #77377 [Opn]: No way to handle CTRL+C in Windows
| From: | ab@php.net | Date: | Mon, 07 Jan 2019 00:10:07 +0000 |
| Subject: | Req #77377 [Opn]: No way to handle CTRL+C in Windows | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-218820@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=77377&edit=1
ID: 77377
Updated by: ab@php.net
Reported by: gadelat at gmail dot com
Summary: No way to handle CTRL+C in Windows
Status: Open
Type: Feature/Change Request
Package: Win32API related
Operating System: Windows 10
PHP Version: 7.2Git-2018-12-30 (Git)
Block user comment: N
Private report: N
New Comment:
@nikic, yeah, EG(vm_interrupt) is also what is used for the timeout handling since 7.1 IIRC. I
remember checking this to that times.
It's impossible to pass the user data to the callback. As a consequence, the handling becomes
tricky. Especially for the thread safe build. For the normal case, we don't start a new thread
and the system sent CTRL+C is process wide. If something like pthreads or libuv is used -
that'll need a magic, as potentially any thread could register a handler and i don't see a
rationale which thread should then get an interrupt. Perhaps that should be the main thread always.
When I was talking about interrupt, what I had in mind was a mechanism more similar to ticks, which
would also need locking and the whole schmear. As an additional issue potential I see is, that one
has to access the globals from another thread, whereby more than one signal could be scheduled and
thus there might be race conditions. Btw. I think some atomic datatype should be used for the
globals on Linux/UNIX as well.
Anyway, thanks for checking. Let me revaluate this once more and do some research.
Thanks.
Previous Comments:
------------------------------------------------------------------------
[2019-01-05 17:21:00] nikic@php.net
@ab: Isn't this the same as with pctnl signal handlers? We can't run PHP code there
either, if for other reasons (not async signal safe). We handle this by registering a VM interrupt
and thus delaying execution of the PHP signal handler.
The same should be possible for Ctrl+C handling on Windows. All the groundwork in the VM is already
there, we just need the interfacing to register the VM interrupt and then call the callback.
------------------------------------------------------------------------
[2019-01-05 17:11:33] ab@php.net
Thanks for the report. Yes, it is a known issue. It is possible to catch ^C on Windows, but the
handler is invoked in a separate thread. That means, it is not safe to run PHP code within the
signal callback. If we would want to handle it, we'd have to insert some interrupts into the
VM, which would slow down the execution. For now it's most likely a won't fix issue,
I'd say.
Thanks.
------------------------------------------------------------------------
[2018-12-30 17:14:21] gadelat at gmail dot com
Description:
------------
There is currently no way how to handle CTRL+C with PHP in Windows. This makes it the only scripting
language I know that cannot handle this and pretty bad choice for writing cross platform compatible
CLI applications.
- handler registered via register_shutdown_function is not called for CTR+C
- pcntl_signal relies on PCNTL extension which isn't available on Windows
Notice that I am trying to avoid word "signal" here as you may argue there are no signals
in Windows. Developer still needs a way how to handle CTRL+C press of end user.
This is important eg. for running cleanup tasks, as not even PHP's tmpfile() cleanup logic is
executed when user aborts program via CTRL+C.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=77377&edit=1