This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2015年01月26日 20:38 by serhiy.storchaka, last changed 2022年04月11日 14:58 by admin.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| signal_std_handlers.patch | serhiy.storchaka, 2015年01月26日 20:38 | review | ||
| Pull Requests | |||
|---|---|---|---|
| URL | Status | Linked | Edit |
| PR 8920 | open | serhiy.storchaka, 2018年08月25日 10:41 | |
| PR 31759 | merged | christian.heimes, 2022年03月08日 10:35 | |
| PR 31768 | merged | miss-islington, 2022年03月08日 18:22 | |
| Messages (14) | |||
|---|---|---|---|
| msg234775 - (view) | Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) | Date: 2015年01月26日 20:38 | |
In C the SIG_DFL and SIG_IGN macros expand into integral expressions that are not equal to an address of any function. In Python they are int objects with platform depended values. Second argument of the signal() function should be SIG_DFL, SIG_IGN, or a function. The getsignal() function returns SIG_DFL, SIG_IGN, None, or a function. They are tested for identity in signal() and getsignal() returns identical values. So actually SIG_DFL and SIG_IGN are just singletons. I propose to turn SIG_DFL and SIG_IGN into functions. Benefits: 1. They will have names and self-descriptive representation. 2. They will have docstrings. 3. The signature of signal() will be simpler. The type of second argument would be function. 4. Their pickling will be portable. This patch depends on the backout of turning these constants to enums (issue21076). |
|||
| msg238327 - (view) | Author: Ethan Furman (ethan.furman) * (Python committer) | Date: 2015年03月17日 18:13 | |
A private method is being added to Enum to better support Enum replacement of constants, part of which includes changing __reduce_ex__ to return the string of the name. These changes answer points 1 and 4. Point 2 would be nice, but seems somewhat less important if Enums are being used. Point 3 -- I don't see how 'Signal(xxx, yyy)' is more complicated than 'Signal(xxx, zzz)'? |
|||
| msg238495 - (view) | Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) | Date: 2015年03月19日 07:17 | |
Currently the action parameter of signal.signal() can be SIG_DFL, SIG_IGN, or a callable Python object. Would be just a callable Python object. This is simpler. The main benefit is that they will be better look in pydoc output. |
|||
| msg238538 - (view) | Author: Ethan Furman (ethan.furman) * (Python committer) | Date: 2015年03月19日 15:51 | |
Thanks for the explanation, point taken. However, it seems to me that changing the type of the constants from 'int' to 'function' is backwards incompatible, will break code, and is probably not worth it (and would require a deprecation period if it was worth it). I still think the better answer is to delve into Modules/signalmodule.c and fix the comparisons. |
|||
| msg324075 - (view) | Author: Xiang Zhang (xiang.zhang) * (Python committer) | Date: 2018年08月25日 16:26 | |
I'm afraid this could break old codes so not sure it's worth or not. I've seen code like `SIGTERM = 15; signal.signal(SIGTERM, handler)`. I won't be surprised to see a handcraft SIG_DFL/IGN. |
|||
| msg324084 - (view) | Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) | Date: 2018年08月25日 17:42 | |
Numerical values of signal numbers are standardized. signal.signal(15, handler) is valid. SIGTERM is just a handy name for the constant 15. But SIG_DFL and SIG_IGN are not integers in C (they are special pointers), and it is not declared anywhere that they should be integers in Python. The code that converts them to Python integer is implementation depending (PyLong_FromVoidPtr). Handcrafted SIG_DFL and SIG_IGN are broken by design, because the signal module uses identity comparison for SIG_DFL and SIG_IGN. |
|||
| msg324096 - (view) | Author: Xiang Zhang (xiang.zhang) * (Python committer) | Date: 2018年08月25日 19:36 | |
I miss that. So this change seems to be user transparent and make more sense then. |
|||
| msg411037 - (view) | Author: Christian Heimes (christian.heimes) * (Python committer) | Date: 2022年01月20日 17:00 | |
Serhiy, could you please rebase your PR to tip of main branch? I'd like to try it out. |
|||
| msg411045 - (view) | Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) | Date: 2022年01月20日 20:43 | |
It may take a time, because the module initialization code has been completely rewritten. |
|||
| msg411104 - (view) | Author: Christian Heimes (christian.heimes) * (Python committer) | Date: 2022年01月21日 09:54 | |
Understood, thanks!
A trivial fix for the integer comparison bug would solve my issue:
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -527,21 +527,20 @@ signal_signal_impl(PyObject *module, int signalnum, PyObject *handler)
"signal number out of range");
return NULL;
}
- if (handler == modstate->ignore_handler) {
+ if (PyCallable_Check(handler)) {
+ func = signal_handler;
+ }
+ else if (PyObject_RichCompareBool(handler, modstate->ignore_handler, Py_EQ) == 1) {
func = SIG_IGN;
}
- else if (handler == modstate->default_handler) {
+ else if (PyObject_RichCompareBool(handler, modstate->default_handler, Py_EQ) == 1) {
func = SIG_DFL;
- }
- else if (!PyCallable_Check(handler)) {
+ } else {
_PyErr_SetString(tstate, PyExc_TypeError,
"signal handler must be signal.SIG_IGN, "
"signal.SIG_DFL, or a callable object");
return NULL;
}
- else {
- func = signal_handler;
- }
/* Check for pending signals before changing signal handler */
if (_PyErr_CheckSignalsTstate(tstate)) {
|
|||
| msg414747 - (view) | Author: Christian Heimes (christian.heimes) * (Python committer) | Date: 2022年03月08日 10:39 | |
My PR 31759 removes the assumption of small int singletons and replaces C comparison with PyObject_RichCompareBool() Py_EQ calls. I still prefer Serhiy's solution, but it may cause backwards incompatible breakage. My fix can be backported to 3.9 and 3.10 without breakage. It resolves my failing tests on Emscripten, too. |
|||
| msg414749 - (view) | Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) | Date: 2022年03月08日 12:29 | |
Agree. There were too many changes in this code, and making SIG_DFL and SIG_IGN functions exposes some issues with sharing objects between interpreters. It is easier to keep them integers for now. |
|||
| msg414765 - (view) | Author: miss-islington (miss-islington) | Date: 2022年03月08日 18:22 | |
New changeset c8a47e76a391c8818bf10a282cdcd3bb5c23ebf6 by Christian Heimes in branch 'main': bpo-23325: Fix SIG_IGN and SIG_DFL int comparison in signal module (GH-31759) https://github.com/python/cpython/commit/c8a47e76a391c8818bf10a282cdcd3bb5c23ebf6 |
|||
| msg414767 - (view) | Author: miss-islington (miss-islington) | Date: 2022年03月08日 18:53 | |
New changeset 95b001fe6766f491f4356f8bcf23d6895bab2342 by Miss Islington (bot) in branch '3.10': bpo-23325: Fix SIG_IGN and SIG_DFL int comparison in signal module (GH-31759) https://github.com/python/cpython/commit/95b001fe6766f491f4356f8bcf23d6895bab2342 |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:58:12 | admin | set | github: 67514 |
| 2022年03月31日 17:54:28 | brett.cannon | set | nosy:
+ brett.cannon |
| 2022年03月08日 18:53:31 | miss-islington | set | messages: + msg414767 |
| 2022年03月08日 18:22:48 | miss-islington | set | messages: + msg414765 |
| 2022年03月08日 18:22:42 | miss-islington | set | nosy:
+ miss-islington pull_requests: + pull_request29876 |
| 2022年03月08日 12:29:48 | serhiy.storchaka | set | messages: + msg414749 |
| 2022年03月08日 10:39:45 | christian.heimes | set | messages: + msg414747 |
| 2022年03月08日 10:35:54 | christian.heimes | set | pull_requests: + pull_request29871 |
| 2022年01月21日 09:54:27 | christian.heimes | set | messages: + msg411104 |
| 2022年01月20日 20:43:16 | serhiy.storchaka | set | messages: + msg411045 |
| 2022年01月20日 17:00:18 | christian.heimes | set | nosy:
+ christian.heimes messages: + msg411037 versions: + Python 3.9, Python 3.11 |
| 2022年01月17日 09:13:52 | christian.heimes | link | issue40280 dependencies |
| 2022年01月17日 09:13:13 | christian.heimes | link | issue46408 superseder |
| 2020年06月28日 11:04:39 | serhiy.storchaka | set | versions: + Python 3.10, - Python 3.8 |
| 2018年08月25日 19:36:50 | xiang.zhang | set | nosy:
+ vstinner messages: + msg324096 |
| 2018年08月25日 17:42:29 | serhiy.storchaka | set | messages: + msg324084 |
| 2018年08月25日 16:26:34 | xiang.zhang | set | nosy:
+ xiang.zhang messages: + msg324075 versions: + Python 3.8, - Python 3.5 |
| 2018年08月25日 10:41:14 | serhiy.storchaka | set | pull_requests: + pull_request8393 |
| 2015年07月21日 08:13:33 | ethan.furman | set | nosy:
- ethan.furman |
| 2015年03月19日 15:51:50 | ethan.furman | set | messages: + msg238538 |
| 2015年03月19日 07:17:04 | serhiy.storchaka | set | messages: + msg238495 |
| 2015年03月17日 18:13:15 | ethan.furman | set | nosy:
+ barry, eli.bendersky messages: + msg238327 |
| 2015年01月26日 20:38:30 | serhiy.storchaka | create | |