Home Article Linux进程通信之---信号灯

Linux进程通信之---信号灯

Release time:2020-04-29 08:50:57 Author:一蓑烟雨 Reading volume:53

信号通信

信号(signal)机制是Unix系统中最为古老的进程间通信机制,很多条件可以产生一个信号:

1、当用户按某些按键时,产生信号

2、硬件异常产生信号:除数为0、无效的存储访问等等。这些情况通常由硬件检测到,将其通知内核,然后内核产生适当的信号通知进程,例如,内核对正访问一个无效存储区的进程产生一个SIGSEGV信号

3、进程用kill函数将信号发送给另一个进程

4、用户可用kill命令将信号发送给其他进程

 信号类型

1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL

5) SIGTRAP 6) SIGIOT 7) SIGBUS 8) SIGFPE

9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2

13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD

18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN

22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ

26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO

30) SIGPWR

下面是几种常见的信号:

§ SIGHUP: 从终端上发出的结束信号

§ SIGINT: 来自键盘的中断信号(Ctrl-C)

§ SIGKILL:该信号结束接收信号的进程

§ SIGTERM:kill 命令发出的信号

§ SIGCHLD:标识子进程停止或结束的信号

§ SIGSTOP:来自键盘(Ctrl-Z)或调试程序的停止执行信号

 信号处理

当某信号出现时,将按照下列三种方式中

的一种进行处理:

1、忽略此信号

大多数信号都按照这种方式进行处理,但有两种信号

决不能被忽略,它们是:

SIGKILLSIGSTOP。

这两种信号不能被忽略的原因是:

它们向超级用户提供了一种终止或停止进程的方法

2、执行用户希望的动作

通知内核在某种信号发生时,调用一个用户函数。在用户函数中,执行用户希望的处理

3、执行系统默认动作

对大多数信号的系统默认动作是终止该进程

 信号发送

发送信号的主要函数有 kill和raise。

区别:

Kill既可以向自身发送信号,也可以向其他进程发送信号。与kill函数不同的是,raise函数是向进程自身发送信号

#include <sys/types.h>

#include

int kill(pid_t pid, int signo)

int raise(int signo)

kill的pid参数有四种不同的情况:

1、pid>0

将信号发送给进程ID为pid的进程。

2、pid == 0

将信号发送给同组的进程。

3、pid < 0

将信号发送给其进程组ID等于pid绝对值的进程。

4、pid ==-1

将信号发送给所有进程。

 alarm

使用alarm函数可以设置一个时间值(闹钟时间),当所设置的时间到了时,产生SIGALRM信号.如果不捕捉此信号,则默认动作是终止该进程

#include

unsigned int alarm(unsigned int seconds)

Seconds:

经过了指定的seconds秒后会产生信号SIGALRM。

每个进程只能有一个闹钟时间.如果在调用alarm时,以前已为该进程设置过闹钟时间,而且它还没有超时,以前登记的闹钟时间则被新值代换

如果有以前登记的尚未超过的闹钟时间,而这次seconds值是0,则表示取消以前的闹钟

 pause

pause函数使调用进程挂起直至捕捉到一个信号。

#include

int pause(void)

只有执行了一个信号处理函数后,挂起才结束

 signal

当系统捕捉到某个信号时,可以忽略该信号或是使用指定的处理函数来处理该信号,或者使用系统默认的方式

信号处理的主要方法有两种,

一种是使用简单的signal函数,

另一种是使用信号集函数组

#include

void (*signal (int signo, void (*func)(int)))(int)

如何理解?

typedef void (*sighandler_t)(int)

sighandler_t

signal(int signum, sighandler_t handler))

func可能的值是:

1、SIG_IGN:忽略此信号

2、SIG_DFL: 按系统默认方式处理

3、信号处理函数名:使用该函数处理

支付宝打赏 微信打赏
  
I want to comment

Search

classification

Leave a message
http://blog.rjxj513.com/
User login
You have not written any reviews yet!
You have commented!
Can only praise once!
You have a collection!