数字信号处理学习,[Linux学习笔记]信号处理

信号的作用:通知进程异步事件的发生。
在Linux中可以识别29中不同的信号,进程可以显示的用kill或killpg系统调用来向另一个进程发信号。信号发生时,内核中断当前进程,进程执行处理函数来响应信号,信号结束后恢复正常的进程处理。
信号 值 处理动作 发出信号的原因 ---------------------------------------------------------------------- SIGHUP 1 A 终端挂起或者控制进程终止 SIGINT 2 A 键盘中断(如break键被按下) SIGQUIT 3 C 键盘的退出键被按下 SIGILL 4 C 非法指令 SIGABRT 6 C 由abort(3)发出的退出指令 SIGFPE 8 C 浮点异常 SIGKILL 9 AEF Kill信号 SIGSEGV 11 C 无效的内存引用 SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道 SIGALRM 14 A 由alarm(2)发出的信号 SIGTERM 15 A 终止信号 SIGUSR1 30,10,16 A 用户自定义信号1 SIGUSR2 31,12,17 A 用户自定义信号2 SIGCHLD 20,17,18 B 子进程结束信号 SIGCONT 19,18,25 进程继续(曾被停止的进程) SIGSTOP 17,19,23 DEF 终止进程 SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键 SIGTTIN 21,21,26 D 后台进程企图从控制终端读 SIGTTOU 22,22,27 D 后台进程企图从控制终端写
SIGBUS 10,7,10 C 总线错误(错误的内存访问) SIGPOLL A Sys V定义的Pollable事件,与SIGIO同义 SIGPROF 27,27,29 A Profiling定时器到 SIGSYS 12,-,12 C 无效的系统调用 (SVID) SIGTRAP 5 C 跟踪/断点捕获 SIGURG 16,23,21 B Socket出现紧急条件(4.2 BSD) SIGVTALRM 26,26,28 A 实际时间报警时钟信号(4.2 BSD) SIGXCPU 24,24,30 C 超出设定的CPU时间限制(4.2 BSD) SIGXFSZ 25,25,31 C 超出设定的文件大小限制(4.2 BSD)
相关函数:
1.捕捉信号:signal
用于决定系统信号的响应。
格式:
#include void (*signal(int signo, void (*func)(int)))(int); //func为SIG_IGN表示内核忽略此信号
//func为SIG_DFL表示接到此信号的动作时默认动作
//func为函数地址时为捕捉信号
2.发送信号:kill和raise、alarm、getitimer和setitimer、pause
kill:向其他进程发信号
raise:向当前进程发信号
alarm:设置一个时间值(闹钟时间),当所设置被超过产生SIGLRM信号,默认动作时终止进程
getitimer和setitimer:获取和设置间隔定时器的函数
pause:使进程挂起,直到捕捉到一个信号
格式:
#include #include int kill(pid_t pid, int sig); int raise(int sig); //raise等价于kill(getpid(),sig) // #include unsigned int alarm(unsigned int seconds); // #include int getitimer(int which, struct itimerval *value); intsetitimer(int which, const struct itimerval *value,struct itimerval *ovalue); // #include int pause(void);
下面说说
【信号屏蔽字】:
每个进程都有一个屏蔽字,它规定了当前要阻塞递送到该进程的信号集。
1.设置
函数:sigpromask、sigpending
sigpromask:检测或更改进程的信号屏蔽字
sigpending:返回对于调用进程被阻塞不能递送和当前未决定的信号集
格式:
#include int sigpromask(int how, const sigset_t *set, sigset_t *oset); int sigpending(sigset_t *set);
2.实现
函数:sigaction
sigaction:检查或修改与指定信号相关联的处理动作。
格式:
#include int sigaction(int signo, const struct sigaction *act, struct sigaction *oact); //结构体原型如下 struct sigaction { void (*sa_handler)();//addr of signal handler, or SIG_IGN, or SIG_DFL sigset_t sa_mask;//additional to block int sa_flag;//signal options };
【相关操作】:
函数:sigsetjmp和siglongjmp、sigsuspend、abort、system、sleep
sigsetjmp和siglongjmp:非局部转移信号处理
sigsuspend:在一个原子操作中实现恢复信号屏蔽字,然后使进程睡眠。
abort:使程序异常终止
system:执行系统命令
sleep:挂起调用中的进程,直到过了预定时间或收到一个信号并从信号处理程序返回。可以由alarm函数实现。
格式:
#include int sigsetjmp(sigjmp_buf env, int savemask); void siglongjmp(sigjmp_buf env, int val); // #include int sigsuspend(const sigset_t *sigmask); // #include void abort(void); int system(const char *string); // #include unsigned int sleep(unsigned int second);
Tags:  linux信号 数字信号处理学习

延伸阅读

最新评论

发表评论