现在的位置: 首页 > 综合 > 正文

linux pthread_kill问题

2013年08月05日 ⁄ 综合 ⁄ 共 1285字 ⁄ 字号 评论关闭

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;
}

如下是执行的结果

linux pthread_kill问题 - linux - 永不止步

抱歉!评论已关闭.