信号
751 words
2 minutes
- 进程间通信方式之一
- 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式
- 信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件
- 忽略信号:对信号不做任何处理,但是有两个信号不能忽略:即SIGKILL及SIGSTOP
- 捕捉信号:定义信号处理函数,当信号发生时,执行相应的处理函数
- 执行缺省操作:Linux对每种信号都规定了默认操作
- 信号量是一个计数器,可以用来控制多个线程对共享资源的访问,它不是用于交换大批数据,而用于多线程之间的同步.它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源
- 主要作为进程间以及同一个进程内不同线程之间的同步手段
1
2
3
| kill pid
# 强制kill
kill -9 pid
|
1
2
| ➜ ~ kill -l
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
| package main
import (
"fmt"
"os"
"os/signal"
"syscall"
)
func main() {
TestSignal()
}
var firstSigusr1 = true
func TestSignal() {
// 忽略 Control-C (SIGINT)
// os.Interrupt 和 syscall.SIGINT 是同义词
signal.Ignore(os.Interrupt)
c1 := make(chan os.Signal, 2)
// Notify SIGHUP
signal.Notify(c1, syscall.SIGHUP)
// Notify SIGUSR1
signal.Notify(c1, syscall.SIGUSR1)
go func() {
for {
switch <-c1 {
case syscall.SIGHUP:
fmt.Println("sighup, reset sighup")
signal.Reset(syscall.SIGHUP)
case syscall.SIGUSR1:
if firstSigusr1 {
fmt.Println("first usr1, notify interrupt which had ignore!")
c2 := make(chan os.Signal, 1)
// Notify Interrupt
signal.Notify(c2, os.Interrupt)
go handlerInterrupt(c2)
}
}
}
}()
select {}
}
func handlerInterrupt(c <-chan os.Signal) {
for {
switch <-c {
case os.Interrupt:
fmt.Println("signal interrupt")
}
}
}
|
进程通信-发送信号1
2
3
4
5
6
7
8
| ➜ p10 go build -o main main.go
➜ p10 ./main
➜ p10 ps aux|grep "\./main"
➜ p10 kill -s INT 14143
➜ p10 kill -s USR1 14143
➜ p10 kill -s INT 14143
➜ p10 kill -s HUP 14143
➜ p10 kill -s HUP 14143
|
预览: