向线程发送信号
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<pthread.h>
#include<signal.h>
#include<errno.h>
#include<unistd.h>
void *thread_fun(void *arg)
{
printf("this is new thread\n");
return (void *)0;
}
int main()
{
pthread_t tid;
int err;
int s;
err = pthread_create(&tid,NULL,thread_fun,NULL);
if(err < 0)
{
printf("create thread failure\n");
return -1;
}
printf("creat thread sucess\n");
sleep(1);
s = pthread_kill(tid,0);//默认线程处理
if(s == ESRCH)//错误码为ESRCH的话,则会打印not found
{
printf("thread tid is not found \n");
}
return 0;
}
信号的处理
#include"myhand.h"
void sig_handler1(int arg)
{
printf("thread1 get signal\n");
return;
}
void sig_handler2(int arg)
{
printf("thread2 get signal\n");
return;
}
void *thread_fun1(void *arg)
{
printf("new thread1 \n");
struct sigaction act;
memset(&act, 0,sizeof(act));
sigaddset(&act.sa_mask,SIGQUIT);
act.sa_handler = sig_handler1;
sigaction(SIGQUIT,&act,NULL);
pthread_sigmask(SIG_BLOCK,&act.sa_mask,NULL);
sleep(2);
}
void *thread_fun2(void *arg)
{
printf("new thread2 \n");
struct sigaction act;
memset(&act, 0,sizeof(act));
sigaddset(&act.sa_mask,SIGQUIT);
act.sa_handler = sig_handler2;
sigaction(SIGQUIT,&act,NULL);
pthread_sigmask(SIG_BLOCK,&act.sa_mask,NULL);
sleep(2);
}
int main()
{
pthread_t tid1, tid2;
int err;
int s;
err = pthread_create(&tid1,NULL,thread_fun1,NULL);
if(err != 0)
{
printf("create new thread 1 failure\n");
return;
}
err = pthread_create(&tid2,NULL,thread_fun2,NULL);
if(err != 0)
{
printf("create new thread 2 failure\n");
return;
}
sleep(2);
s = pthread_kill(tid1,SIGQUIT);
if(s != 0)
{
printf("send signal to thread1 failed\n");
}
s = pthread_kill(tid2,SIGQUIT);
if(s != 0)
{
printf("send signal to thread1 failed\n");
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}
pthread_cleanup_push(void (*rtn)(void ), void *args) 注册处理程序
第一个参数是要处理的函数
第二个参数是传入的值,用来传递处理函数,给pthread_cleanup_push里面一个值,值在函数里面操作
pthread_cleanup_pop(int excute) //清理处理程序
例如:
pthread_cleanup_pop(0)表示线程清除,而1表示线程为未清除
这两个函数是成对出现的,否则编译无法通过
当执行一下操作的时候调用清理函数,清理函数的参数由args传入
1、调用pthread_exit
2、响应取消请求(请你来验证)
3、用非常参数调用pthread_cleanup_pop
#include"myhand.h"
void *first_clean(void *arg)
{
printf("%s first clean\n",arg);
return(void *)0;
}
void *second_clean(void *arg)
{
printf("%s second clean\n",arg);
return(void *)0;
}
void *thread1(void *arg)
{
printf("new thread 1\n");
pthread_cleanup_push(first_clean,"thread1");//创建注册处理函数
pthread_cleanup_push(second_clean,"thread1");
pthread_cleanup_pop(1);//清理处理函数,和上面是一起出现的
pthread_cleanup_pop(0);
return (void *)1;
}
void *thread2(void *arg)
{
printf("new thread2\n");
pthread_cleanup_push(first_clean,"thread2");
pthread_cleanup_push(second_clean,"threa2");
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
pthread_exit((void *)2);
}
int main()
{
pthread_t tid1,tid2;
int err;
err = pthread_create(&tid1,NULL,thread1,NULL);
if(err != 0)
{
printf("create new thread 1 failed\n");
return -1;
}
err = pthread_create(&tid2,NULL,thread2,NULL);
if(err != 0)
{
printf("create new thread 2 failed\n");
return -1;
}
sleep(2);//睡眠,让新线程去执行
return 0;
}
在这里因为是栈运行的,所以出栈是第二个先出