pthread_kill是向线程发送signal。相关API函数如下:
int pthread_kill(pthread_t thread, int sig);
该函数向指定的ID的线程发送sig信号,如果线程代码内不做任何的处理,则按照信号的默认行为会影响到整个进程。如果向一个线程发送了SIGQUIT,但线程取没有实现signal处理函数,则整个进程退出!
pthread_kill(threadid, SIGKILL);将杀死的是整个进程,如果要火的正确的行为,需要在线程内实现signal(SIGKILL, sig_handle)的方法函数。
如果sig参数不是0,则一定要清楚到底是要干什么,而且要实现线程的信号处理函数,否则影响整个进程!
sig 为0,这是一个保留的信号,这个信号可以用来判断线程是否依然存活!
通过pthread_kill的返回值可以处理:如果返回值为 0 表示成功实行了pthread_kill函数;如果返回值为 ESRCH 表示线程不存在;如果返回值为 EINVAL 表示该信号不合法!
而是可以使用如下的代码判断某个线程是否依然存活:
pthread_t tid;
...... //经过一系列的相关操作
int nRst = pthread_kill(tid, 0);
根据nRst的返回值进行判断 tid 的是否依然存活,如果 nRst == 0 说明该 tid 的线程依然是存活的!
======> 以下是一个简单的没有处理的pthread_kill导致杀死整个进程的demo
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>
void* thread_route(void* id)
{
int i;
printf("This is in the running thread route!\n");
sleep(2);
pthread_t tid = pthread_self();
//pthread_kill(tid, SIGKILL);
for(i=0; i<20; ++i)
{
printf("I am the num:%d \n",i);
sleep(1);
}
sleep(5);
}
void* kill_route(void* threadId)
{
pthread_t* ptid = (pthread_t*)threadId;
sleep(15);
pthread_kill(*ptid, SIGKILL);
printf("The thread killed\n");
}
int main(void)
{
pthread_t tid1;
pthread_t tid2;
pthread_create(&tid1, NULL, thread_route, NULL);
pthread_create(&tid2, NULL, kill_route, (void*)&tid1);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
return 0;
}
int pthread_kill(pthread_t thread, int sig);
该函数向指定的ID的线程发送sig信号,如果线程代码内不做任何的处理,则按照信号的默认行为会影响到整个进程。如果向一个线程发送了SIGQUIT,但线程取没有实现signal处理函数,则整个进程退出!
pthread_kill(threadid, SIGKILL);将杀死的是整个进程,如果要火的正确的行为,需要在线程内实现signal(SIGKILL, sig_handle)的方法函数。
如果sig参数不是0,则一定要清楚到底是要干什么,而且要实现线程的信号处理函数,否则影响整个进程!
sig 为0,这是一个保留的信号,这个信号可以用来判断线程是否依然存活!
通过pthread_kill的返回值可以处理:如果返回值为 0 表示成功实行了pthread_kill函数;如果返回值为 ESRCH 表示线程不存在;如果返回值为 EINVAL 表示该信号不合法!
而是可以使用如下的代码判断某个线程是否依然存活:
pthread_t tid;
...... //经过一系列的相关操作
int nRst = pthread_kill(tid, 0);
根据nRst的返回值进行判断 tid 的是否依然存活,如果 nRst == 0 说明该 tid 的线程依然是存活的!
======> 以下是一个简单的没有处理的pthread_kill导致杀死整个进程的demo
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>
void* thread_route(void* id)
{
int i;
printf("This is in the running thread route!\n");
sleep(2);
pthread_t tid = pthread_self();
//pthread_kill(tid, SIGKILL);
for(i=0; i<20; ++i)
{
printf("I am the num:%d \n",i);
sleep(1);
}
sleep(5);
}
void* kill_route(void* threadId)
{
pthread_t* ptid = (pthread_t*)threadId;
sleep(15);
pthread_kill(*ptid, SIGKILL);
printf("The thread killed\n");
}
int main(void)
{
pthread_t tid1;
pthread_t tid2;
pthread_create(&tid1, NULL, thread_route, NULL);
pthread_create(&tid2, NULL, kill_route, (void*)&tid1);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
return 0;
}
如下是执行的结果