Pthread学习笔记(2)
pthread_kill函数
函数原型如下:
int pthread_kill(pthread_t thread, int sig);
该函数与kill函数类似,但是该函数用于向某个线程发送函数。
如下程序,主线程向子线程发送15信号,也就是SIGTERM信号,该信号如果不设置捕获(处理函数)便会导致终止,那么该程序的结果便可以看出终止的是线程还是进程。
#include<pthread.h>
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
pthread_t pt;
void *func(void* argv)
{
printf("from func\n");
for(int i=0;i<5;i++)
{
printf("func i=%d\n",i);
sleep(1);
}
}
int main()
{
pthread_create(&pt,NULL,func,NULL);
sleep(1);
pthread_kill(pt,15);
for(int i=0;i<5;i++)
{
printf("main i=%d\n",i);
sleep(1);
}
}
程序的输出如下,可以看出当子线程收到了信号时这个进程直接终止了:
~$ ./demo3
from func
func i=0
func i=1
已终止
设置捕获函数,哪个线程处理?
在主线程中设置处理函数
首先得说明不管在哪设置处理函数都是会修改进程PCB中对应信号的sigaction,不会存在主线程收到15信号的处理函数和子线程收到的处理函数不同(不过sigwait之类的函数倒是可以)。
在main函数中设置捕获15信号时的处理函数为handle。
#include<pthread.h>
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
pthread_t pt;
void handle(int sig)
{
printf("receive signal:%d\n",sig);
fo