Linux下的信号(二)

xiaoxiao2021-02-28  118

相关博客

Linux下的信号(一)

http://blog.csdn.net/double_happiness/article/details/72848372

信号的四种产生方式

(一)通过键盘上的某些组合键完成

(二)由硬件产生信号

****前面两种在上一篇中已经详细介绍过了,再次就不在叙述

(三)调用相应的函数实现

1)调用kill函数

#include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); 功能:一个进程调用kill(2)函数可以发送信号给另一个进程;如果不明确指定信号则发送SIGTERM信号,该信号的默认处理动作是终止进程 返回值:成功返回0,失败返回-1

2)使用raise函数

#include <signal.h> int raise(int sig); 功能:每隔一段时间,自己给自己发送一个信号

返回值:成功返回0,失败返回-1;

3)调用abort函数

#include <stdlib.h> void abort(void); 功能:终止一个进程,可以被捕获,但必须被终止

返回值:这个返回值比较特殊,就像我们前面在进程替换中学习的exec函数族一样,只有出错返回值,没有成功返回值。

*****几个函数的比较

1)kill和raise函数的区别

kill:可以给任意进程发送任意信号

raise:只能给自己发送任意信号

(2)exit和abort函数的区别

exit:正常退出

abort:异常退出

(四)由软件条件产生信号

#include <unistd.h> unsigned int alarm(unsigned int seconds) 功能:设置一个闹钟,参数为闹钟的秒数

返回值:返回值为闹钟的剩余时间

阻塞信号

http://blog.csdn.net/double_happiness/article/details/72897592

信号捕捉

信号捕捉的时机:从系统态切换回用户态的时候

信号捕捉流程

1)主流程因为指令中断或异常转而进入内核态,处理完返回用户态时,先处理当前进程中可以递送的信号;

2)若信号的处理动作是自定义的转而去执行自定义动作流程;

3)自定义函数处理完毕返回时,再次进入内核态;

4)执行完毕从内核态返回用户态时,到达主流程当时中断或者异常处继续执行。

图示表示

sigaction

#include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 功能:读取和修改与指定信号相关联的处理动作

参数说明:

signum:指定信号的编号

act:若指针非空,根据act修改该信号的处理动作

cldact:若指针非空,通过oldact传出原来的处理动作

sigaction结构体

结构体成员变量说明:

sa_handler:赋值为常数SIG_IGN传给sigaction表示忽略信号;赋值为常数SIG_DFL表示执行系统默认动作,赋值为一个函数指针表示用自定义函数捕捉信号。 向内核注册了一个信号处理函数,该函数返回值为void,可以带一个int参数,通过参数可以得知当前信号的编号,这样就可以用同一个函数处理多种信号。显然,这也是一个回调函数,不是被main函数调用,而是被系统所调用。

sa_mask:进程的信号屏蔽字。如果在调用信号处理函数时,除了当前信号被自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需要额外屏蔽的信号,当信号处理函数返回时自动恢复原来的信号屏蔽字。

sa_flags:sa_flags字段包含一些选项,本文代码把sa_flags设为0。

sa_sigaction是实时信号的处理函数。

可重入函数

http://blog.csdn.net/double_happiness/article/details/72877112

pause与竟态条件

http://blog.csdn.net/double_happiness/article/details/72900010

SIGCHLD信号

http://blog.csdn.net/double_happiness/article/details/72900014

转载请注明原文地址: https://www.6miu.com/read-33693.html

最新回复(0)