Contents

信号

信号

概念

  • 进程间通信方式之一
  • 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式
  • 信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件

用户进程对信号的响应方式

  • 忽略信号:对信号不做任何处理,但是有两个信号不能忽略:即SIGKILL及SIGSTOP
  • 捕捉信号:定义信号处理函数,当信号发生时,执行相应的处理函数
  • 执行缺省操作:Linux对每种信号都规定了默认操作

区别于信号量

  • 信号量是一个计数器,可以用来控制多个线程对共享资源的访问,它不是用于交换大批数据,而用于多线程之间的同步.它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源
  • 主要作为进程间以及同一个进程内不同线程之间的同步手段

kill命令

熟悉的使用是,停掉进程

1
2
3
kill pid
# 强制kill
kill -9 pid

那么9代表什么

  • 查看所有信号名称
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
  • 查看对应的信号ID
1
2
➜  ~ kill -l INT
2
  • 向进程发送信号
1
➜  p10 kill -s USR1 pid

同类的命令

  • pkill,killall

golang signal使用示例

具体代码

 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")
		}
	}
}

具体使用

  • 命令步骤
https://static.duan1v.top/images/e31850f52edf5d32f23829395d3ef82d.png
进程通信-发送信号
  • 命令明细
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

本文参考

coffee