首页 > 其他分享 >信号相关

信号相关

时间:2024-10-10 15:23:55浏览次数:1  
标签:core set int 终止 信号 进程 相关

信号

信号是软件中断,提供了一种处理异步事件的方法,如在终端按下Ctrl+C会产生SIGINT中断信号。

信号产生

  • 用户键入:必须在终端按下Ctrl+CCtrl+X等会产生对应信号
  • 硬件异常产生信号:除数为0、无效的内存引用等,如对执行一个无效内存引用的进程产生SIGSEGV信号
  • 进程调用kill函数将信号发送给另一个进程或进程组,接收信号进程和发送信号进程的所有者必须相同,或发送信号进程的所有者是超级用户
  • 用户可用kill命令将信号发送给其他进程
  • 当检测到某种软件条件已经发生,并将其通知有关进程时也产生信号。如管道的读进程已终止,此时向管道写会产生SIGPIPE信号

信号处理

  1. 忽略。大多数信号都可使用该方式,担忧两种信号不能被忽略(SIGKILL和SIGSTOP)。
  2. 捕捉信号。需提前通知内核在某种信号发生时调用一个用户函数,在该函数中用户处理这个信号事件。
  3. 执行系统默认动作。大多数信号的系统默认动作是终止进程。

信号列举(以Linux2.4.22为例)

名字 说明 默认动作 名字 说明 默认动作
SIGABRT 异常终止(abort) 终止+core SIGALRM 超时(alarm) 终止
SIGBUS 硬件故障 终止+core SIGCHLD 子进程状态改变 忽略
SIGCONT 使暂停进程继续 继续/忽略 SIGEMT 硬件故障 终止+core
SIGFPE 算术异常 终止+core SIGHUP 连接断开 终止
SIGILL 非法硬件指令 终止+core SIGINT 终端中断符 终止
SIGIO 异步IO 终止/忽略 SIGIOT 硬件故障 终止+core
SIGKILL 终止 终止 SIGPIPE 写至无读进程的管道 终止
SIGPOLL 可轮询事件(poll) 终止 SIGPROF 梗概事件超时 终止
SIGPWR 电源失效/重启动作 终止/忽略 SIGQUIT 终端退出符 终止+core
SIGSEGV 无效内存引用 终止+core SIGSTKFLT 协处理器栈故障 终止
SIGSTOP 停止 暂停进程 SIGSYS 无效系统调用 终止+core
SIGTERM 终止 终止 SIGTRAP 硬件故障 终止+core
SIGTSTP 终端停止符 暂停进程 SIGTTIN 后台读控制tty 暂停进程
SIGTTOU 后台写至控制tty 暂停进程 SIGURG 紧急情况(套接字) 忽略
SIGUSR1 用户定义的信号 终止 SIGUSR2 用户定义的信号 终止
SIGVTALRM 虚拟时间闹钟 终止 SIGWINCH 终端窗口大小改变 忽略
SIGXCPU 超过CPU限制 终止+core SIGXFSZ 超过文件长度限制 终止+core

信号相关函数

#include <signal.h>
// 成功返回信号以前的处理配置,出错返回SIG_ERR
// signo是上表的信号名
// func是常量SIG_IGN、SIG_DFL或当接收此信号后要调用的函数地址
void (*signal(int signo, void (*func)(int)))(int);

signal函数原型说明此函数需要两个参数,返回一个函数指针。

static void sig_usr(int signo) {
  printf("received SIGUSR1\n");
}
int main()
{
  if(signal(SIGUSR1, sig_usr) == SIG_ERR)
    printf("can't catch SIGUSR1");
}

当执行一个程序时,所有信号的状态都是系统默认或忽略,当一个进程fork时,其子进程继承父进程的信号处理方式。

信号集

一个能表示多个信号的数据类型。

// 初始化set指向的信号集,清除其中所有信号
int sigemptyset(sigset_t *set);
// 初始化set,使其包括所有信号
int sigfillset(sigset_t *set);
// 添加
int sigaddset(sigset_t *set, int signo);
// 删除
int sigdelset(sigset_t *set, int signo);
// 用于判断是否包括指定信号
int sigismember(const sigset_t *set, int signo);

调用sigprocmask可以检测或更改其信号屏蔽字,用于阻塞指定信号传递到当前进程。

// how指示怎样用set修改当前信号屏蔽字
//    SIG_BLOCK:当前信号屏蔽字并上set
//    SIG_UNBLOCK:解除存在set中的当前信号屏蔽字
//    SIG_SETMASK:用set替代当前信号屏蔽字
// oset非空则当前信号屏蔽字通过oset返回
int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);
// 返回当前信号集
int sigpending(sigset_t *set);

sigaction函数用于检查或修改与指定信号相关联的处理动作,用以取代signal函数

// signo是要检测或修改的信号编号;act指向要修改的动作,oact用于接收信号之前的动作
int sigaction(int signo, const struct sigaction *restrict act, struct sigaction *restrict oact);
/* 其中sigaction结构:
struct sigaction {
  void (*sa_handler)(int);  /*信号处理函数地址*/
  sigset_t sa_mask;         /*阻塞的信号*/
  int sa_flags;             
  /*可替代的信号处理函数地址*/
  void (*sa_sigaction)(int, siginfo_t *, void *);
};
// 其中sa_mask会在嗲用信号捕捉函数前加到进程的信号屏蔽字中,当从信号捕捉函数返回时会将信号屏蔽字恢复
*/

可以阻塞选择的信号以保护不希望被信号中断的代码临界区,之后再解除阻塞,然后等待之前被阻塞的信号发生,但我们无法控制信号发生的时间窗口,可能在解除阻塞调用返回前就触发了信号,这是不可靠的,我们需要在一个原子操作中先恢复信号屏蔽字然后使进程休眠,可由sigsuspend函数提供该功能。

// 将进程屏蔽字设置为sigmask指向的值,在捕捉到一个信号或发生了一个会终止该进程的信号前,该进程被挂起
// 如果捕捉到信号且从信号处理程序返回,则sigsuspend返回,并将进程信号屏蔽字恢复
int sigsuspend(const sigset_t *sigmask);

标签:core,set,int,终止,信号,进程,相关
From: https://www.cnblogs.com/songlh424/p/18454570

相关文章

  • 谈JVM xmx, xms等内存相关参数合理性设置
    作者:京东零售刘乐上一篇文章说到JVM垃圾回收算法的两个优化标的:吞吐量和停顿时长,并提到这两个优化目标是有冲突的。那么有没有可能提高吞吐量而不影响停顿时长,甚至缩短停顿时长呢?答案是有可能的,提高内存占用(MemoryFootprint)就有可能同时优化这两个标的,这篇文章就来聊聊内存相关......
  • HDMI CEC信号
    HDMICEC(ConsumerElectronicsControl,消费者电子控制)是HDMI标准中的一项功能,旨在通过单一的HDMI连接线实现多设备之间的互联与统一控制。具体来说,CEC允许连接的设备通过专用的CEC引脚进行通信,从而实现例如通过一个遥控器控制多台设备的功能。HDMICEC信号的作用在HDMI接口中,CEC......
  • 51c嵌入式分享~三极管相关1
    一、PNP与NPN两种三极管使用方法  分享这篇文章总结下关于NPN和PNP两种型号三极管的使用和连接方法。    在单片机应用电路中三极管主要的作用就是开关作用。PNP与NPN两种三极管使用方法    上图中,横向左侧的引脚叫做基极b,有一个箭头的是发射极e,剩下的一个引脚就是集电......
  • arm imx6ull docker启动失败问题查找与解决 内核配置相关
    1、增加POSIXMessageqeue:couldnotgetinitialnamespace:nosuchfileordirectory CONFIG_POSIX_MQUEUE=y2、增加namespacefailedtosettoinitialnamespaceCONFIG_NAMESPACES=y3、创建网络失败,veth配置:dockercreateendpointquirky_shternonnetworkbridge......
  • 交换机相关最终_续2
    节后修改版2:importtelnetlibimporttimeimportpandasaspdimportredeftelnet_login(host_ip,username,password):tn=telnetlib.Telnet()try:tn.open(host_ip,port=23,timeout=5)tn.read_until(b'Username:',timeout=5)......
  • 43 C 程序动态内存分配:内存区域划分、void 指针、内存分配相关函数(malloc、calloc、re
    目录1 C程序内存区域划分1.1代码区(CodeSection)1.2全局/静态区(Global/StaticSection)1.3栈区(StackSection)1.4 堆区(HeapSection)1.5动态内存分配2void指针(无类型指针)2.1void指针介绍2.2void指针的作用2.3void指针的特点2.4 void指针类......
  • 响应速度相关知识
    在讨论Android性能问题的时候,卡顿、响应速度、ANR这三个性能相关的知识点通常会放到一起来讲,因为引起卡顿、响应慢、ANR的原因类似,只不过根据重要程度,被人为分成了卡顿、响应慢、ANR三种,所以我们可以定义广义上的卡顿,包含了卡顿、响应慢和ANR三种,所以如果用户反馈说手机......
  • 交换机相关最终_续
    1.包含比较检查和修改步骤importparamikoimportosimporttimeimportrandomimportdatetimeimportpandasaspdimportreimportnumpyasnpfromsqlalchemyimporttext,create_engineimportpsycopg2frompsycopg2importsqlfromsqlalchemy.ormimportsessi......
  • 无线电通信卡:9-基于DSP TMS320C6678+FPGA XC7V690T的6U VPX信号处理卡
    一、概述     本板卡基于标准6U VPX 架构,为通用高性能信号处理平台,系我公司自主研发。板卡采用一片TI DSP TMS320C6678和一片Xilinx公司Virtex 7系列的FPGA XC7V690T-2FFG1761I作为主处理器,Xilinx 的Aritex XC7A200T作为辅助处理器。XC7A200T负责管理板卡的上电时......
  • 交换机相关最终
    用判断语句实现所有可能场景`importtelnetlibimporttimeimportpandasaspdimportredeftelnet_login(host_ip,username,password):tn=telnetlib.Telnet()try:tn.open(host_ip,port=23,timeout=5)tn.read_until(b'Username:',timeout=5)tn.write(username.encode......