一、基本概念
什么是信号:由进程或系统发出的,用来通知发生了某个事件,希望接收方进行响应。
信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。正如我们所了解的中断服务函数一样,在中断发生的时候, 就会进入中断服务函数中去处理,同样的,当进程接收到一个信号的时候,也会相应地采取一些行动。
信号的特点:适合发送简单的数据,信号的数值系统是有限制的。
对信号的处理方式:
1)对信号进行捕获处理。
2)忽略信号,对发送来的信号不做处理(SIGKILL,SIGSTOP是不能被忽略的)。
3)按信号的默认行为来进行处理。
可以用kill -l 查看系统中存在的信号,在Linux系统中信号33和32是不存在的,而且信号是以SIG开头的。
二、对信号的处理
1)发送信号
① int kill(pid_t pid, int sig); //对哪个进程发送什么类型的信号
pid的取值说明:
1.pid>0 时:发送信号给指定的进程。
2.pid=0 时:信号发送到和当前进程在同一进程组的进程。
3.pid=-1时:发送到系统中所有的进程,进程1 (init) 除外。
4.pid<-1时:将信号sig发送给进程组号为-pid (pid绝对值)的每一个进程。
sig:要发送的信号类型(上面的62种)。
② int sigqueue(pid_t pid, int sig, const union sigval value); //当发送信号,需要携带数据时
sigval是一个联合体,
union sigval {
int sival_int;
void *sival_ptr;
};
这个联合体可以存放你所需要的数据。
③int raise(int sig); //发送信号给本进程
④unsigned int alarm(unsigned int seconds); //在进程中设置一个定时器 也称为闹钟函数
在设置多个定时器时,后面的定时器会覆盖前一个的时间。它的返回值是之前闹钟的剩余秒数,如果之前未设闹钟则返回0。 特别地,如果新的seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回。
2)捕获信号
①sighandler_t signal(int signum, sighandler_t handler);
signum:要捕获的信号类型
handler:对信号处理的响应函数
②int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
sa_handler:是一个函数指针,传入int类型参数,返回值是void,就和signal的信号处理函数一样。
sa_sigaction则是扩展信号处理函数
sa_mask:设置阻塞或非阻塞模式,使用SA_NODEFER标志,不阻塞。
sa_flags:修改信号处理过程行为的标志
3)阻塞信号
int pause(void);
举例,拿闹钟函数,和捕获信号处理
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
void handler(int sig)
{
if(sig == SIGALRM)
{
printf("你制定的信号时间到了!\n");
printf("----------------------\n");
}
}
int main()
{
//设置一个alarm定时器
unsigned int ret;
ret = alarm(5);
//对alarm信号做一个捕获 利用sigaction()
struct sigaction act; //定一个sigaction的结构体变量
act.sa_handler = handler; //利用sa_handler来接收处理信号的函数
sigemptyset(&act.sa_mask); //信号处理时不会屏蔽其他信号
act.sa_flags = SA_RESETHAND; //处理完一次后,恢复该信号的默认处理模式
sigaction(SIGALRM,&act,NULL);
sleep(6);
printf("end\n");
return 0;
}
标签:int,void,pid,嵌入式,间通信,信号,进程,sa,sigaction
From: https://blog.csdn.net/weixin_46432503/article/details/142572189