您的位置:首页 > 运维架构 > Linux

linux pthread_kill问题

2013-09-18 14:54 155 查看
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;

}
如下是执行的结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: