用python写系统内核_Python内核阅读(二十五):信号处理机制

本文详细介绍了Python内核中的信号处理机制,包括初始化、信号忽略、信号模块创建、信号处理函数的注册与调用。通过分析Python源码,揭示了如何将信号值转换为Python对象,以及如何在主线程中安全地处理信号,确保信号的正确传递和执行。
摘要由CSDN通过智能技术生成

起步

信号机制的初始化

[Python/pylifecycle.c]

_PyInitError

_Py_InitializeMainInterpreter(PyInterpreterState *interp,

const _PyMainInterpreterConfig *config)

{

...

if (interp->config.install_signal_handlers) {

err = initsigs(); /* Signal handling stuff, including initintr() */

if (_Py_INIT_FAILED(err)) {

return err;

}

}

...

}

[Python/pylifecycle.c]

static _PyInitError

initsigs(void)

{

#ifdef SIGPIPE

PyOS_setsig(SIGPIPE, SIG_IGN); // 忽略SIGPIPE

#endif

#ifdef SIGXFZ

PyOS_setsig(SIGXFZ, SIG_IGN); // 忽略SIGXFZ

#endif

#ifdef SIGXFSZ

PyOS_setsig(SIGXFSZ, SIG_IGN); // 忽略SIGXFSZ file size exceeded

#endif

PyOS_InitInterrupts(); /* May imply initsignal() */

if (PyErr_Occurred()) {

return _Py_INIT_ERR("can't import signal");

}

return _Py_INIT_OK();

}

[Modules/signalmodule.c]

void

PyOS_InitInterrupts(void)

{

PyObject *m = PyImport_ImportModule("_signal");

if (m) {

Py_DECREF(m);

}

}

[Modules/signalmodule.c]

PyMODINIT_FUNC

PyInit__signal(void)

{

PyObject *m, *d, *x;

int i;

main_thread = PyThread_get_thread_ident();

main_pid = getpid();

// 创建signal模块

m = PyModule_Create(&signalmodule);

if (m == NULL)

return NULL;

...

/* Add some symbolic constants to the module */

d = PyModule_GetDict(m);

// 将SIG_DFL、SIGIGN 转化成Python整数对象

x = DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL);

if (!x || PyDict_SetItemString(d, "SIG_DFL", x) < 0)

goto finally;

x &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值