linux系统中SIGUSR1信号是如何产生的。

linux系统中SIGUSR1信号是如何产生的。,第1张

首先,Linux中的信号可以通过kill -l命令获取,如下图所示:

如上图所示,编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。

其次,SIGUSR1 ,这是留给用户使用的信号。一般在编程中使用。举例说明:sigqueue向本进程发送数据的信号,C语言代码如下 :

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <signal.h>

#include <unistd.h>

void myhandler(int signo,siginfo_t *si,void *ucontext)

int main(){

union sigval val//定义一个携带数据的共用体

struct sigaction oldact,act

act.sa_sigaction=myhandler

act.sa_flags=SA_SIGINFO//表示使用sa_sigaction指示的函数,处理完恢复默认,不阻塞处理过程中到达下在被处理的信号

//注册信号处理函数

sigaction(SIGUSR1,&act,&oldact)

char data[100]

int num=0

while(num<10){

sleep(2)

printf("等待SIGUSR1信号的到来\n") 

sprintf(data,"%d",num++)

val.sival_ptr=data

sigqueue(getpid(),SIGUSR1,val)//向本进程发送一个信号

}

}

void myhandler(int signo,siginfo_t *si,void *ucontext){

printf("已经收到SIGUSR1信号\n")

printf("%s\n",(char*)(si->si_ptr))

}

linux的常用信号量BUS与SEGV二者都是错误信号,BUS表示总线错误,SEGV表示段错误,程序崩溃的时候99%都是这两个错误导致的。进程可以捕获和封锁这两类错误。内核对二者的默认处理是memorydumpWINCH窗口改变信号(WINdownCHanged)。例如虚拟终端的行数发生变化时将发送WINCH信号,绝大多数文本编辑器都能捕获WINCH信号自动进行重新配置。内核的默认处理是忽略该信号,并且不进行内存转储。进程可以捕获或者封锁该信号KILL 杀死/删除进程,编号为9STOP 挂起/暂停正在执行的进程,直到收到CONT为止KILLSTOP都不能够被捕获、封锁或者忽略,默认处理都不会产生内存转储。CONT 取消挂起,继续执行进程TSTP 是STOP信号的“软”版本,即在用户输入Ctrl+Z时由终端驱动程序发送的信号。捕获到该信号的进程通常清除它们的状态,如何给自己发送一个STOP信号。TSTP的默认处理不会导致内存转储。INT 中断信号,编号为2当用户输入Ctrl+C时由终端驱动程序发送INT信号INT信号是终止当前 *** 作的请求,简单程序捕获到INT信号时应该退出,拥有命令行或者输入模式的那些程序应该停止他们正在做的事情,清除状态,并等待用户再次输入。TERM 软件终止信号,编号为15TERM是请求彻底终止某项 *** 作的信号,它期望进程清楚自己的状态并退出QUIT 退出信号,编号为3与TERM类似,不同之处在于QUIT信号的默认处理是内存转储,而TERM信号的默认处理没有内存转储。HUP 挂起信号,编号为1,有两种解释:守护进程理解HUP为重新设置的请求,如果守护进程能够不用重新启动就能够重新读取它自己的配置文件并调整自己以适应变化的话,那么HUP信号通常可以用来触发这种行为HUP信号有时有终端驱动程序生成,试图用来清除(也就是终止)跟某个特定终端相连接的那些进程。例如当一个终端会话结束时,或者当一个Modem的连接不经意的断开时,就可能出现这种情况。如果需要某些进程在会话结束之后继续运行,那么在CShell中设法让这些进程变成后台程序,ksh或者bash中可以用nohup来模拟这种行为。++++++++++++++++++++++++++++++++++++++++++++++++++++++++++进程的四种状态runnable(可运行状态)只要有CPU时间,进程就可以执行。一旦进程执行了不能立即完成的系统调用,Linux会把进程转入睡眠状态sleeping(睡眠状态)进程在等待某些事件发生(如终端输入、网络连接)zombie(僵化状态)进程已经执行完毕并试图消亡,但是状态没有收集完stopped(停止状态)进程被挂起,不允许执行。进程收到STOP或者TSTP信号即进入停止状态,可以用CONT信号来重新启动


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7124217.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-01
下一篇2023-04-01

发表评论

登录后才能评论

评论列表(0条)

    保存