linux pthread_kill问题

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 - 永不止步


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值