📄 signalmodule.c
字号:
goto finally;
x = IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN);
if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0)
goto finally;
x = PyInt_FromLong((long)NSIG);
if (!x || PyDict_SetItemString(d, "NSIG", x) < 0)
goto finally;
Py_DECREF(x);
x = IntHandler = PyDict_GetItemString(d, "default_int_handler");
if (!x)
goto finally;
Py_INCREF(IntHandler);
Handlers[0].tripped = 0;
for (i = 1; i < NSIG; i++) {
void (*t)(int);
t = PyOS_getsig(i);
Handlers[i].tripped = 0;
if (t == SIG_DFL)
Handlers[i].func = DefaultHandler;
else if (t == SIG_IGN)
Handlers[i].func = IgnoreHandler;
else
Handlers[i].func = Py_None; /* None of our business */
Py_INCREF(Handlers[i].func);
}
if (Handlers[SIGINT].func == DefaultHandler) {
/* Install default int handler */
Py_INCREF(IntHandler);
Py_DECREF(Handlers[SIGINT].func);
Handlers[SIGINT].func = IntHandler;
old_siginthandler = PyOS_setsig(SIGINT, signal_handler);
}
#ifdef SIGHUP
x = PyInt_FromLong(SIGHUP);
PyDict_SetItemString(d, "SIGHUP", x);
Py_XDECREF(x);
#endif
#ifdef SIGINT
x = PyInt_FromLong(SIGINT);
PyDict_SetItemString(d, "SIGINT", x);
Py_XDECREF(x);
#endif
#ifdef SIGBREAK
x = PyInt_FromLong(SIGBREAK);
PyDict_SetItemString(d, "SIGBREAK", x);
Py_XDECREF(x);
#endif
#ifdef SIGQUIT
x = PyInt_FromLong(SIGQUIT);
PyDict_SetItemString(d, "SIGQUIT", x);
Py_XDECREF(x);
#endif
#ifdef SIGILL
x = PyInt_FromLong(SIGILL);
PyDict_SetItemString(d, "SIGILL", x);
Py_XDECREF(x);
#endif
#ifdef SIGTRAP
x = PyInt_FromLong(SIGTRAP);
PyDict_SetItemString(d, "SIGTRAP", x);
Py_XDECREF(x);
#endif
#ifdef SIGIOT
x = PyInt_FromLong(SIGIOT);
PyDict_SetItemString(d, "SIGIOT", x);
Py_XDECREF(x);
#endif
#ifdef SIGABRT
x = PyInt_FromLong(SIGABRT);
PyDict_SetItemString(d, "SIGABRT", x);
Py_XDECREF(x);
#endif
#ifdef SIGEMT
x = PyInt_FromLong(SIGEMT);
PyDict_SetItemString(d, "SIGEMT", x);
Py_XDECREF(x);
#endif
#ifdef SIGFPE
x = PyInt_FromLong(SIGFPE);
PyDict_SetItemString(d, "SIGFPE", x);
Py_XDECREF(x);
#endif
#ifdef SIGKILL
x = PyInt_FromLong(SIGKILL);
PyDict_SetItemString(d, "SIGKILL", x);
Py_XDECREF(x);
#endif
#ifdef SIGBUS
x = PyInt_FromLong(SIGBUS);
PyDict_SetItemString(d, "SIGBUS", x);
Py_XDECREF(x);
#endif
#ifdef SIGSEGV
x = PyInt_FromLong(SIGSEGV);
PyDict_SetItemString(d, "SIGSEGV", x);
Py_XDECREF(x);
#endif
#ifdef SIGSYS
x = PyInt_FromLong(SIGSYS);
PyDict_SetItemString(d, "SIGSYS", x);
Py_XDECREF(x);
#endif
#ifdef SIGPIPE
x = PyInt_FromLong(SIGPIPE);
PyDict_SetItemString(d, "SIGPIPE", x);
Py_XDECREF(x);
#endif
#ifdef SIGALRM
x = PyInt_FromLong(SIGALRM);
PyDict_SetItemString(d, "SIGALRM", x);
Py_XDECREF(x);
#endif
#ifdef SIGTERM
x = PyInt_FromLong(SIGTERM);
PyDict_SetItemString(d, "SIGTERM", x);
Py_XDECREF(x);
#endif
#ifdef SIGUSR1
x = PyInt_FromLong(SIGUSR1);
PyDict_SetItemString(d, "SIGUSR1", x);
Py_XDECREF(x);
#endif
#ifdef SIGUSR2
x = PyInt_FromLong(SIGUSR2);
PyDict_SetItemString(d, "SIGUSR2", x);
Py_XDECREF(x);
#endif
#ifdef SIGCLD
x = PyInt_FromLong(SIGCLD);
PyDict_SetItemString(d, "SIGCLD", x);
Py_XDECREF(x);
#endif
#ifdef SIGCHLD
x = PyInt_FromLong(SIGCHLD);
PyDict_SetItemString(d, "SIGCHLD", x);
Py_XDECREF(x);
#endif
#ifdef SIGPWR
x = PyInt_FromLong(SIGPWR);
PyDict_SetItemString(d, "SIGPWR", x);
Py_XDECREF(x);
#endif
#ifdef SIGIO
x = PyInt_FromLong(SIGIO);
PyDict_SetItemString(d, "SIGIO", x);
Py_XDECREF(x);
#endif
#ifdef SIGURG
x = PyInt_FromLong(SIGURG);
PyDict_SetItemString(d, "SIGURG", x);
Py_XDECREF(x);
#endif
#ifdef SIGWINCH
x = PyInt_FromLong(SIGWINCH);
PyDict_SetItemString(d, "SIGWINCH", x);
Py_XDECREF(x);
#endif
#ifdef SIGPOLL
x = PyInt_FromLong(SIGPOLL);
PyDict_SetItemString(d, "SIGPOLL", x);
Py_XDECREF(x);
#endif
#ifdef SIGSTOP
x = PyInt_FromLong(SIGSTOP);
PyDict_SetItemString(d, "SIGSTOP", x);
Py_XDECREF(x);
#endif
#ifdef SIGTSTP
x = PyInt_FromLong(SIGTSTP);
PyDict_SetItemString(d, "SIGTSTP", x);
Py_XDECREF(x);
#endif
#ifdef SIGCONT
x = PyInt_FromLong(SIGCONT);
PyDict_SetItemString(d, "SIGCONT", x);
Py_XDECREF(x);
#endif
#ifdef SIGTTIN
x = PyInt_FromLong(SIGTTIN);
PyDict_SetItemString(d, "SIGTTIN", x);
Py_XDECREF(x);
#endif
#ifdef SIGTTOU
x = PyInt_FromLong(SIGTTOU);
PyDict_SetItemString(d, "SIGTTOU", x);
Py_XDECREF(x);
#endif
#ifdef SIGVTALRM
x = PyInt_FromLong(SIGVTALRM);
PyDict_SetItemString(d, "SIGVTALRM", x);
Py_XDECREF(x);
#endif
#ifdef SIGPROF
x = PyInt_FromLong(SIGPROF);
PyDict_SetItemString(d, "SIGPROF", x);
Py_XDECREF(x);
#endif
#ifdef SIGXCPU
x = PyInt_FromLong(SIGXCPU);
PyDict_SetItemString(d, "SIGXCPU", x);
Py_XDECREF(x);
#endif
#ifdef SIGXFSZ
x = PyInt_FromLong(SIGXFSZ);
PyDict_SetItemString(d, "SIGXFSZ", x);
Py_XDECREF(x);
#endif
if (!PyErr_Occurred())
return;
/* Check for errors */
finally:
return;
}
static void
finisignal(void)
{
int i;
PyObject *func;
PyOS_setsig(SIGINT, old_siginthandler);
old_siginthandler = SIG_DFL;
for (i = 1; i < NSIG; i++) {
func = Handlers[i].func;
Handlers[i].tripped = 0;
Handlers[i].func = NULL;
if (i != SIGINT && func != NULL && func != Py_None &&
func != DefaultHandler && func != IgnoreHandler)
PyOS_setsig(i, SIG_DFL);
Py_XDECREF(func);
}
Py_XDECREF(IntHandler);
IntHandler = NULL;
Py_XDECREF(DefaultHandler);
DefaultHandler = NULL;
Py_XDECREF(IgnoreHandler);
IgnoreHandler = NULL;
}
/* Declared in pyerrors.h */
int
PyErr_CheckSignals(void)
{
int i;
PyObject *f;
if (!is_tripped)
return 0;
#ifdef WITH_THREAD
if (PyThread_get_thread_ident() != main_thread)
return 0;
#endif
if (!(f = PyEval_GetFrame()))
f = Py_None;
for (i = 1; i < NSIG; i++) {
if (Handlers[i].tripped) {
PyObject *result = NULL;
PyObject *arglist = Py_BuildValue("(iO)", i, f);
Handlers[i].tripped = 0;
if (arglist) {
result = PyEval_CallObject(Handlers[i].func,
arglist);
Py_DECREF(arglist);
}
if (!result)
return -1;
Py_DECREF(result);
}
}
is_tripped = 0;
return 0;
}
/* Replacements for intrcheck.c functionality
* Declared in pyerrors.h
*/
void
PyErr_SetInterrupt(void)
{
is_tripped++;
Handlers[SIGINT].tripped = 1;
Py_AddPendingCall((int (*)(void *))PyErr_CheckSignals, NULL);
}
void
PyOS_InitInterrupts(void)
{
initsignal();
_PyImport_FixupExtension("signal", "signal");
}
void
PyOS_FiniInterrupts(void)
{
finisignal();
}
int
PyOS_InterruptOccurred(void)
{
if (Handlers[SIGINT].tripped) {
#ifdef WITH_THREAD
if (PyThread_get_thread_ident() != main_thread)
return 0;
#endif
Handlers[SIGINT].tripped = 0;
return 1;
}
return 0;
}
void
PyOS_AfterFork(void)
{
#ifdef WITH_THREAD
PyEval_ReInitThreads();
main_thread = PyThread_get_thread_ident();
main_pid = getpid();
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -