linux线程2

向线程发送信号
在这里插入图片描述

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

在这里插入图片描述
在这里因为是栈运行的,所以出栈是第二个先出

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值