python 信号处理句柄第二个参数的作用

本文介绍了如何使用Python的signal包预设信号处理函数。通过signal.signal()函数注册信号处理函数,实现对特定信号的响应。文章提供了具体示例,展示了如何定义处理函数并注册信号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

预设信号处理函数

signal包的核心是使用signal.signal()函数来预设(register)信号处理函数,如下所示:

singnal.signal(signalnum, handler)

signalnum为某个信号,handler为该信号的处理函数。我们在信号基础里提到,进程可以无视信号,可以采取默认操作,还可以自定义操作。当handler为signal.SIG_IGN时,信号被无视(ignore)。当handler为singal.SIG_DFL,进程采取默认操作(default)。当handler为一个函数名时,进程采取函数中定义的操作。

复制代码
import signal
# Define signal handler function
def myHandler(signum, frame):
    print('I received: ', signum)

# register signal.SIGTSTP's handler 
signal.signal(signal.SIGTSTP, myHandler)
signal.pause()
print('End of Signal Demo')
复制代码

 

在主程序中,我们首先使用signal.signal()函数来预设信号处理函数。然后我们执行signal.pause()让该进程暂停以等待信号,以等待信号。当信号SIGUSR1被传递给该进程时,进程从暂停中恢复,并根据预设,执行SIGTSTP的信号处理函数myHandler()。myHandler的两个参数一个用来识别信号(signum),另一个用来获得信号发生时进程栈的状况(stack frame)。这两个参数都是由signal.singnal()函数来传递的。


转自: http://www.cnblogs.com/vamei/archive/2012/10/06/2712683.html

<think>嗯,用户之前已经问过线程如何实现“一起干但风险共担”,现在他接着问如何创建线程,特别是结合常用函数作用逐步解释。这说明他想从理论过渡到实践,可能是在学习多线程编程,需要具体的代码示例和函数说明。 首先,我得确定用户的编程语言环境。线程的创建在不同语言中有不同的实现,比如Python、Java、C等。但根据之前的回答,用户可能更倾向于使用C语言,因为pthread库是C中的标准。不过,为了保险起见,我应该先确认,但可能用户默认是C环境。 接下来,用户需要的是逐步解释,结合常用函数。所以应该分步骤,从包含头文件、定义线程函数、创建线程、到同步和终止线程。每个步骤里要解释用到的函数,比如pthread_create, pthread_join, pthread_exit,以及互斥锁相关的函数。 同时,用户可能对线程的安全问题感兴趣,比如数据竞争,所以例子中需要包含互斥锁的使用。另外,用户可能对编译命令不熟悉,特别是链接pthread库,所以需要提醒编译时的参数。 需要注意的是,用户可能没有太多实际经验,所以例子要简单明了,避免复杂的结构。比如使用一个全局变量,两个线程去修改它,通过锁来保护。同时,在步骤解释中,要说明每个函数作用参数的意义,比如pthread_create的四个参数分别是什么。 还要考虑错误处理,但为了简化,可能先忽略错误检查,专注于流程。不过,最好还是提到可能的错误检查,比如检查pthread_create的返回值。 最后,总结部分要强调流程和注意事项,比如线程安全、资源管理,以及风险共担的概念,和之前的问题呼应起来,帮助用户形成完整的理解。</think>在编程中创建线程需要依赖操作系统或语言提供的线程库。以下以 **C语言(POSIX线程库 pthread)** 为例,结合关键函数作用,逐步说明线程的创建过程及核心逻辑。 --- ### **一、线程创建核心步骤** #### **1. 包含头文件与编译选项** ```c #include <pthread.h> // POSIX线程库头文件 // 编译时需加 -lpthread 参数(如:gcc thread.c -o thread -lpthread) ``` #### **2. 定义线程函数** 线程的执行入口是一个**函数**,其格式需满足: ```c void* thread_function(void* arg) { // 线程具体任务 pthread_exit(NULL); // 可选:退出线程 } ``` - **作用**:定义线程启动后执行的任务逻辑 - **参数**:`arg` 是创建线程时传递的参数(可以是任意类型指针) - **返回值**:`void*`(可返回结果给主线程) --- #### **3. 创建线程(核心函数:pthread_create)** ```c pthread_t thread_id; // 线程标识符 int ret = pthread_create(&thread_id, NULL, thread_function, (void*)arg); ``` - **参数解析**: - **第1个参数**:`&thread_id`,存储新线程的ID(类似身份证号) - **第2个参数**:线程属性(通常填`NULL`使用默认属性) - **第3个参数**:线程入口函数指针(即上一步定义的函数) - **第4个参数**:传递给线程函数参数(可传递结构体等复杂数据) - **返回值**:`0` 表示成功,非零为错误码 --- #### **4. 等待线程结束(pthread_join)** ```c pthread_join(thread_id, NULL); // 阻塞主线程,等待子线程结束 ``` - **作用**: - 主线程等待子线程完成,避免主线程提前退出导致子线程被强制终止 - 可获取子线程返回值(通过第二个参数传递指针) --- #### **5. 完整代码示例** ```c #include <stdio.h> #include <pthread.h> // 线程函数:打印传入的数值 void* print_number(void* arg) { int num = *(int*)arg; // 将void*转换为int* printf("Thread received: %d\n", num); pthread_exit(NULL); } int main() { pthread_t tid; int value = 42; // 创建线程,传递value的地址 if (pthread_create(&tid, NULL, print_number, &value) != 0) { perror("Thread creation failed"); return 1; } // 等待线程结束 pthread_join(tid, NULL); printf("Main thread: child finished\n"); return 0; } ``` --- ### **二、关键扩展:线程同步函数** 多线程操作共享数据时,必须使用**同步机制**防止数据竞争: #### **1. 互斥锁(Mutex)** ```c pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 定义并初始化锁 // 加锁 pthread_mutex_lock(&mutex); // 临界区代码(操作共享资源) pthread_mutex_unlock(&mutex); // 解锁 ``` #### **2. 条件变量(Condition Variable)** ```c pthread_cond_t cond = PTHREAD_COND_INITIALIZER; // 等待条件成立 pthread_cond_wait(&cond, &mutex); // 触发条件信号 pthread_cond_signal(&cond); ``` --- ### **三、线程生命周期总结** 1. **创建**:`pthread_create` 生成新线程 2. **运行**:执行线程函数逻辑(可能涉及同步) 3. **终止**:函数返回或调用 `pthread_exit` 4. **回收**:主线程通过 `pthread_join` 回收资源 --- ### **四、注意事项** 1. **线程安全**:共享数据必须通过锁保护 2. **参数传递**:传递堆内存或全局变量,避免栈内存失效 3. **资源泄漏**:确保线程结束后释放锁、文件句柄等资源 4. **编译链接**:必须添加 `-lpthread` 参数 --- **比喻理解**: 线程创建就像雇佣一个临时工—— - `pthread_create` = 签合同分配任务 - `pthread_join` = 等待临时工完成任务并验收 - 互斥锁 = 给共享工具柜配钥匙,避免多人同时乱拿工具 🔑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值