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))

}

signal函数的定义很复杂,但是它的用法还是比较简单的,你记住它的两个参数就可以了。signal有两个参数sig和func,signal这个函数是用来接收信号并处理的,所以sig参数表示将要处理哪种类型的信号,而func参数是一个函数指针,用来指定信号的处理函数,也就是当程序接收到sig那个类型的信号后,就会调用func指针指向的函数。func指针的原型是:

void (*func) (int)

所以信号的处理函数必须是一个返回void,只有一个int类型参数的函数。

比如如果程序需要处理Ctrl+C组合键产生的信号,就可以这样使用signal函数:

(void) signal(SIGINT, myfunc)

而myfunc函数可以这样定义:

void myfunc(int sig)

{

printf("Hello, the signal is %d\n", sig)

// 因为现在处理的是Ctrl+C信号,所以下面要

// 恢复程序对Ctrl+C的默认反应

(void) signal(SIGINT, SIG_DFL)

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存