当前位置: 首页 > news >正文

郑州网站建设靠谱公司/广州seo关键字推广

郑州网站建设靠谱公司,广州seo关键字推广,wordpress 获取缩略图,设计公司网站的要点前言: signal 是一种通信机制,可以跨进程发送,可以同进程跨线程发送,可以不同进程向指定线程发送。 信号的创建有两套api,一个是signal,一个是sigaction,signal缺陷很多,比如没有提…

前言:

signal 是一种通信机制,可以跨进程发送,可以同进程跨线程发送,可以不同进程向指定线程发送。

信号的创建有两套api,一个是signal,一个是sigaction,signal缺陷很多,比如没有提供触发后自动再次设置处理信号处理策略,这会导致连续触发的两个信号,一个进入了期待的信号处理流程,另外一个则进入了默认的信号处理流程。

信号的递送和接受处理是异步的,即信号发送者不会因为信号接收者使用了阻塞信号处理函数而被阻塞住。但是信号的递送可能会出现阻塞,这个阻塞发生在信号发送者把信号送入内核的信号队列中(需要从代码层面验证)。

信号处理方式:

信号的处理有三种方式:默认,忽略,信号处理函数,可以在使用 sigaction 创建信号处理策略时指定。

默认分为如下几种:

       Term   Default action is to terminate the process.

       Ign    Default action is to ignore the signal.

       Core   Default action is to terminate the process and dump core (see core(5)).

       Stop   Default action is to stop the process.

       Cont   Default action is to continue the process if it is currently stopped.

不同信号的默认行为如下:

       Signal      Standard   Action   Comment  ────────────────────────────────────────────────────────────────────────
       SIGABRT      P1990      Core    Abort signal from abort(3)
       SIGALRM      P1990      Term    Timer signal from alarm(2)
       SIGBUS       P2001      Core    Bus error (bad memory access)
       SIGCHLD      P1990      Ign     Child stopped or terminated
       SIGCLD         -        Ign     A synonym for SIGCHLD
       SIGCONT      P1990      Cont    Continue if stopped
       SIGEMT         -        Term    Emulator trap
       SIGFPE       P1990      Core    Floating-point exception
       SIGHUP       P1990      Term    Hangup detected on controlling terminal or death of controlling process
       SIGILL       P1990      Core    Illegal Instruction
       SIGINFO        -                A synonym for SIGPWR
       SIGINT       P1990      Term    Interrupt from keyboard
       SIGIO          -        Term    I/O now possible (4.2BSD)
       SIGIOT         -        Core    IOT trap. A synonym for SIGABRT
       SIGKILL      P1990      Term    Kill signal
       SIGLOST        -        Term    File lock lost (unused)
       SIGPIPE      P1990      Term    Broken pipe: write to pipe with no readers; see pipe(7)
       SIGPOLL      P2001      Term    Pollable event (Sys V). Synonym for SIGIO
       SIGPROF      P2001      Term    Profiling timer expired
       SIGPWR         -        Term    Power failure (System V)
       SIGQUIT      P1990      Core    Quit from keyboard
       SIGSEGV      P1990      Core    Invalid memory reference
       SIGSTKFLT      -        Term    Stack fault on coprocessor (unused)
       SIGSTOP      P1990      Stop    Stop process
       SIGTSTP      P1990      Stop    Stop typed at terminal
       SIGSYS       P2001      Core    Bad system call (SVr4); see also seccomp(2)
       SIGTERM      P1990      Term    Termination signal
       SIGTRAP      P2001      Core    Trace/breakpoint trap
       SIGTTIN      P1990      Stop    Terminal input for background process
       SIGTTOU      P1990      Stop    Terminal output for background process
       SIGUNUSED      -        Core    Synonymous with SIGSYS
       SIGURG       P2001      Ign     Urgent condition on socket (4.2BSD)
       SIGUSR1      P1990      Term    User-defined signal 1
       SIGUSR2      P1990      Term    User-defined signal 2
       SIGVTALRM    P2001      Term    Virtual alarm clock (4.2BSD)
       SIGXCPU      P2001      Core    CPU time limit exceeded (4.2BSD); see setrlimit(2)
       SIGXFSZ      P2001      Core    File size limit exceeded (4.2BSD); see setrlimit(2)
       SIGWINCH       -        Ign     Window resize signal (4.3BSD, Sun)

通过pthread_kill进行线程间信号传递

信号可以时线程级别的,可以通过 pthread_kill 给同进程的其他线程发信号,可以通过 tgkill 给其他进程的指定线程发信号,通过 raise 可以给当前线程发信号。

Demo:

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>pthread_t newtid;void usrHandler(int signum,siginfo_t *info,void *ucontext)
{printf("[SIGUSR1 handler thread] tid -> %d , ready to send SIGUSR2 to child thread \n",gettid());pthread_kill(newtid,SIGUSR2);printf("[SIGUSR1 handler thread] tid -> %d , SIGUSR2 sent out \n",gettid());
}void usrHandler2(int signum,siginfo_t *info,void *ucontext)
{printf("[SIGUSR2 handler thread] tid -> %d , %d , SIGUSR2 received \n",gettid(),signum);
}void* threadRoutine(void* arg)
{pthread_t tid = *(pthread_t*)arg;printf("[new thread] tid -> %d , arg -> %d \n",gettid(),tid);// set SIGSUR2sigset_t mask2;sigemptyset(&mask2);struct sigaction act2;memset(&act2,0x0,sizeof(struct sigaction));struct sigaction oldact2;memset(&oldact2,0x0,sizeof(struct sigaction));act2.sa_sigaction = usrHandler2;act2.sa_mask = mask2;act2.sa_flags = 0; //no flag is setsigaction(SIGUSR2, &act2, &oldact2);while(1) {;}
}int main(int argc,char** argv)
{printf("[main thread] tid -> %d \n",gettid());
// set SIGUSR1sigset_t mask;sigemptyset(&mask);struct sigaction act;memset(&act,0x0,sizeof(struct sigaction));struct sigaction oldact;memset(&oldact,0x0,sizeof(struct sigaction));act.sa_sigaction = usrHandler;act.sa_mask = mask;act.sa_flags = 0; //no flag is setsigaction(SIGUSR1, &act, &oldact);pthread_t maintid = gettid();pthread_create(&newtid,NULL,&threadRoutine,(void*)&maintid);sleep(2);while(1) {raise(SIGUSR1);sleep(2);}
}

上面的例子中,主线程会循环给自己发信号 SIGUSR1 ,在信号处理函数中会给子线程发送 SIGUSR2。

当子线程通过pthread_kill给主线程发送信号时,会产生 SIGSEGV, 具体原因不明,如果有类似情况,可以参考如下:

pthread_kill引发的争论 - 简书最近提测的一段代码中有一个,遇到一个诡异的bug,总是崩溃在pthread_kill这个函数上,并且不是每次比现。调用逻辑大致如下,利用pthread_kill判断一个线程是...icon-default.png?t=N7T8https://www.jianshu.com/p/756240e837dd

ps:可以通过 pause 挂起当前线程,直到等到一个信号为止;可以通过 sigsuspend 挂起当前线程,直到等到某些信号为止。

管理mask

每个线程都有自己的mask,可以通过pthread_sigmask来管理。

通过mask进行信号block

使用sigaction创建信号处理策略时指定mask。被列入mask集合中的signal会被阻塞,直到阻塞信号的动作结束,这些信号会被继续投递到信号处理逻辑中。

比如通过sigaction 指定 “当发生SIGUSR1的时候,阻塞所有SIGUSR2”,那么如果 SIGUSR1 的信号处理函数耗时较长,那么 SIGUSR2 会一直等到 SIGUSR1 的处理函数走完才会被递送给相应的进程/线程 以触发 默认动作/忽略动作/信号处理函数。

Demo:

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>#define USRSIG SIGUSR1
#define RTSIG SIGRTMIN+8void usrHandler(int signum,siginfo_t *info,void *ucontext)
{printf("%d , SIGUSR1 reveived \n",signum);printf("Sender pid[%d] , User cost time [%ld] , System cost time [%ld] , si_code [%d] \n ",info->si_pid,info->si_utime,info->si_stime,info->si_code);sleep(15);printf("exit usrHandler\n");
}void usrHandler2(int signum,siginfo_t *info,void *ucontext)
{printf("%d , SIGUSR2 received \n",signum);
}int main(int argc,char** argv)
{
// set SIGUSR1sigset_t mask;sigemptyset(&mask);sigaddset(&mask,SIGUSR2); // SIGUSR2 will be blocked when usrHandler is executing. After return from  usrHandler, SIGUSR2 will// be received adn surHandler2 will be executed.struct sigaction act;memset(&act,0x0,sizeof(struct sigaction));struct sigaction oldact;memset(&oldact,0x0,sizeof(struct sigaction));act.sa_sigaction = usrHandler;act.sa_mask = mask;act.sa_flags = 0; //no flag is setsigaction(SIGUSR1, &act, &oldact);// set SIGSUR2sigset_t mask2;sigemptyset(&mask2);struct sigaction act2;memset(&act2,0x0,sizeof(struct sigaction));struct sigaction oldact2;memset(&oldact2,0x0,sizeof(struct sigaction));act2.sa_sigaction = usrHandler2;act2.sa_mask = mask2;act2.sa_flags = 0; //no flag is setsigaction(SIGUSR2, &act2, &oldact2);while(1) {;}
}

当通过 kill 连续发送 SIGUSR1 和 SIGUSR2 给上面的例子时,会发现执行流程会卡在 SIGUSR1 处理函数的 sleep ,这是因为针对 SIGUSR1 设置了block SIGUSR2,这会导致 SIGUSR2 无法中断 SIGUSR1。

相关文章:

[Linux C] signal 的使用

前言&#xff1a; signal 是一种通信机制&#xff0c;可以跨进程发送&#xff0c;可以同进程跨线程发送&#xff0c;可以不同进程向指定线程发送。 信号的创建有两套api&#xff0c;一个是signal&#xff0c;一个是sigaction&#xff0c;signal缺陷很多&#xff0c;比如没有提…...

AI时代产品经理升级之道:ChatGPT让产品经理插上翅膀

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 AI时代的产品经理面临着…...

计算机网络重点概念整理-第七章 网络安全【期末复习|考研复习】

计算机网络复习系列文章传送门&#xff1a; 第一章 计算机网络概述 第二章 物理层 第三章 数据链路层 第四章 网络层 第五章 传输层 第六章 应用层 第七章 网络安全 计算机网络整理-简称&缩写 文章目录 前言七、网络安全7.1网络安全7.2 网络威胁7.3 加密7.3.1 对称加密7.3.…...

【LeetCode力扣】42. 接雨水

目录 1、题目介绍 2、解题思路 2.1、暴力破解法 2.2、双指针法 1、题目介绍 原题链接&#xff1a; 42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1]输出&#xff1a;6解释&#xff1a;上面是由…...

03、SpringCloud -- 动态倒计时 及 当前用户的获取(用户未登录提示其登录)

目录 动态倒计时需求思路代码效果优化获取当前登录用户思路代码前端后端controllerservice接口impl实现效果问题修改动态倒计时 需求 根据不同时间展示不同状态,动态显示时间,如原型图: 思...

Mac用户心目中的四款首选原型工具

Wireframe、Mockup和prototype在原型工具中有什么区别&#xff1f; 无论你是刚进入这个行业的UX/UI设计师&#xff0c;还是已经进入这个行业多年的老手&#xff0c;你都必须在制作原型的过程中接触或听到三个非常重要的原型术语&#xff1a;“wireframe(线框图)Mockup”或“pr…...

国内内卷太严重,还不考虑一下在海外接单?那这几个平台你知道吗?

作为一个程序员&#xff0c;在平台上接单赚点外快是再正常不过的事情了&#xff0c;但是现今国内各个平台都内卷比较严重&#xff0c;你是否考虑过去“外面的世界”看看&#xff1f; 如果想过&#xff0c;那么这几个外国的接单平台你都知道吗&#xff1f; 接下来就和我一起来看…...

在excel中如何打出上标、下标

例如&#xff0c;想把A2的2变为下标。 在单元中输入内容&#xff1a; 选中2&#xff1a; 右键单击&#xff0c;然后点击“设置单元格格式”&#xff1a; 在特殊效果的下面勾选“下标”&#xff0c;然后点击下面的“确定”按钮&#xff1a; 就将2变为下标了&#xff1a;…...

LoongArch 五级流水线实现

在单周期的基础上进行拆分成取指、译码、执行、访存、写回五级流水线。 mycpu_top.v include "mycpu.h"module id_stage(input clk ,input reset ,//allowininput …...

「Qt中文教程指南」如何创建基于Qt Widget的应用程序(四)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文描述了如何使用…...

11、SpringCloud -- 利用redis优化查询秒杀商品的数据(就是可以把商品数据先存到redis中)

目录 秒杀商品数据存到redis中并查询需求hash理解代码&#xff1a;RedisService商品数据初始化&#xff1a;查询 测试&#xff1a; 秒杀商品数据存到redis中并查询 需求 利用redis优化查询秒杀商品的数据&#xff0c;就是可以把商品数据先存到redis中&#xff0c;要查的时候先…...

计算节点上iptables安全组分析

计算节点上iptables安全组分析 之前介绍过neutron 安全组基于iptables 和 ct 实现&#xff0c;分析一下计算节点上面的neutron 安全组的iptables&#xff0c;加深一下理解iptables以及安全组的实现。&#xff08;PS: 如下基于openstack stein) 查看某计算节点上面的iptables …...

香港科技大学广州|可持续能源与环境学域博士招生宣讲会—上海专场!!!(暨全额奖学金政策)

香港科技大学广州&#xff5c;可持续能源与环境学域博士招生宣讲会—上海专场&#xff01;&#xff01;&#xff01;&#xff08;暨全额奖学金政策&#xff09; “面向未来改变游戏规则的——可持续能源与环境学域” &#xfffd;&#xfffd;&#xfffd;专注于能源环境跨学…...

有没有什么网站可以在线做视频脚本?批量制作视频,批量替换素材混剪?

随着视频内容的普及和需求的不断增长&#xff0c;越来越多的个人和团队开始涉足视频制作领域。为了提高效率并满足大量制作需求&#xff0c;许多在线视频制作工具应运而生&#xff0c;提供了一系列便捷的功能&#xff0c;如在线视频脚本编辑、批量制作视频、批量替换素材和混剪…...

【python数学建模】特征值与特征向量运用

1、求数列通项 &#xff08;1&#xff09;转化为求矩阵的幂次问题 例&#xff1a;求斐波那契数列的通项公式 已知斐波那契数列满足&#xff1a; F k 2 F k 1 F k F_{k2}F_{k1}F_{k} Fk2​Fk1​Fk​ &#xff08;a&#xff09; 降阶&#xff1a;将二阶差分方程转化为一阶…...

什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(1)

先看卷积是啥&#xff0c;url: https://www.bilibili.com/video/BV1JX4y1K7Dr/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 下面这个式子就是卷积 看完了&#xff0c;感觉似懂非懂 下一个参考视频&#xff1a;https://www.y…...

java解决修改图片尺寸,压缩图片后出现背景变黑,图片字体模糊问题

将以下数学公式的图片使用Hutool提供的图片工具类改变尺寸 代码如下: package com.jason.common.file.word;import cn.hutool.core.img.ImgUtil; import cn.hutool.core.io.FileUtil;import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage;…...

jq/js检测鼠标指针移动离开页面

通过 mouseout 鼠标事件&#xff0c;判断鼠标去往哪个元素 知识点&#xff1a;relatedTarget 事件属性 定义和用法 relatedTarget 事件属性返回与事件的目标节点相关的节点。 对于 mouseover 事件来说&#xff0c;该属性是鼠标指针移到目标节点上时所离开的那个节点。 对于 …...

ICC2: 如何在显示GUI操作产生的命令

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 ICC2&#xff1a;自定义快捷键和菜单 VIEW -> Perference -> Global Settings 把display commands in logging console 下面几个都勾上即可。...

内网渗透——macOS上搭建Web服务器

# 公网访问macOS本地web服务器【内网穿透】 文章目录 1. 启动Apache服务器2. 公网访问本地web服务2.1 本地安装配置cpolar2.2 创建隧道2.3 测试访问公网地址3. 配置固定二级子域名3.1 保留一个二级子域名3.2 配置二级子域名4. 测试访问公网固定二级子域名 以macOS自带的Apache…...

Centos下用nodejs实现一个简单的web服务器

WebRTC是音视频直播中最常用的一个框架&#xff0c;在使用的过程中&#xff0c;我们就需要实现一个服务器端。本文以nodejs实现一个服务器为例&#xff0c;讲述一下在centos下如何用nodejs实现一个简单的web服务器。 一、安装nodejs 在linux环境下安装nodejs有多重方式&#x…...

3.10每日一题(三角有理函数积分(三角函数加减乘除))

1、通过类型判别方法>判断出为凑 tanx 2、加项减项拆常用的积分公式 注&#xff1a;tanx的导数是&#xff1a;cosx的平方分之一 cosx的平方分之一 1 tanx arctanx的求导公式要记住...

python练习(猜数字,99乘法表)

python练习(猜数字&#xff0c;99乘法表) 猜数字 import random num1random.choice(range(1,101))for i in range(11):num2input("plz input a number:")num2int(num2)if num1<num2:print("太大了&#xff0c;小一点")elif num1>num2:print("…...

正确部署Baichuan2(Ubuntu20.4) 步骤及可能出现的问题

部署其实是不太复杂的,但实际上也耗费了接近2-3天的时间去不断的设置 1 硬件配置信息 采用esxi 虚拟化的方式将T4 卡穿透给esxi 种的ubuntu20.4虚拟机 CPU给到8 core 内存至少32GB以上 T4卡是16GB 2 预先准备OS环境 这里使用的是ubuntu20.4版本,esxi中需要设置uefI启动方…...

docker 部署prometheus和grafana

1.启动node 容器 docker run -d -p 9100:9100 -v "/proc:/host/proc:ro" -v "/sys:/host/sys:ro" -v "/:/rootfs:ro" --net"bridge" prom/node-exporter 2.访问http://192.168.1.122:9100/metrics 3.创建文件/home/prometheus/ 下…...

在本地模拟C/S,Socket套接字的使用

public class SocketTCP01Server {public static void main(String[] args) throws IOException {/**1.在本机的 9999 端口监听 &#xff0c;等待连接细节&#xff1a; 要求在本机没有其他服务在监听999细节&#xff1a;这个ServerSocket 可以通过accept()返回多个Socket[多个客…...

香港科技大学广州|可持续能源与环境学域博士招生宣讲会—东南大学专场!!!(暨全额奖学金政策)

香港科技大学广州&#xff5c;可持续能源与环境学域博士招生宣讲会—东南大学专场&#xff01;&#xff01;&#xff01;&#xff08;暨全额奖学金政策&#xff09; “面向未来改变游戏规则的——可持续能源与环境学域” 专注于能源环境跨学科尖端技术研究 培养可持续能源技术…...

[Leetcode] 0108. 将有序数组转换为二叉搜索树

108. 将有序数组转换为二叉搜索树 题目描述 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1&#xff1a…...

Pandas数据导入和导出:CSV、Excel、MySQL、JSON

导入MySQL查询结果&#xff1a;read_sql import pandascon "mysqlpymysql://user:pass127.0.0.1/test" sql "SELECT * FROM student WHERE id 2"# sql查询 df1 pandas.read_sql(sqlsql, concon) print(df1)导入MySQL整张表&#xff1a;read_sql_table…...

第16期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练 Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…...