> 文档中心 > golang并发编程-01多进程编程-03信号

golang并发编程-01多进程编程-03信号

文章目录

  • 1. 开始/停止自行处理接收到的信号
  • 2. 向进程发送信号

1. 开始/停止自行处理接收到的信号

是IPC中唯一一种异步的通讯方法。

func Signal01()  {//01 创建过程fmt.Println("==========创建过程============")//创建一个通道1sigRecv1 := make(chan os.Signal, 1)//创建  信号集合1(定义了终止信号和结束信号)sigs1 := []os.Signal{syscall.SIGINT, syscall.SIGQUIT}fmt.Printf("Set notification for %s... [sigRecv1]\n", sigs1)//将信号传入通道signal.Notify(sigRecv1, sigs1...)//创建  通道2、信号集合2,并将信号集合2传入通道2sigRecv2 := make(chan os.Signal, 1)//创建  信号集合2(只定义了退出信号,因此后边携程打印不了退出信号)sigs2 := []os.Signal{syscall.SIGQUIT}fmt.Printf("Set notification for %s... [sigRecv2]\n", sigs2)signal.Notify(sigRecv2, sigs2...)//02 创建携程var wg sync.WaitGroup//添加一个值为2的差量(以便后边判断何时关闭)wg.Add(2)//创建携程1,打印信号组1接收到的信号go func() {for sig := range sigRecv1 {//打印出接收到的信号fmt.Printf("Received a signal from sigRecv1: %s\n", sig)}fmt.Printf("携程1  End. [sigRecv1]\n")//wg的差量 -1wg.Done()}()//创建携程2,打印 信号组2 接收到的信号。(因为信号组2没有定义退出信号,因此后边实验中不能打印 Ctrl +C)go func() {for sig := range sigRecv2 {fmt.Printf("Received a signal from sigRecv2: %s\n", sig)}fmt.Printf("携程2   End. [sigRecv2]\n")wg.Done()}()//03 实验过程过程fmt.Println("==========实验开始============")//等待5秒,我们在这个时间内实验信号的传入。fmt.Println("Wait for 5 seconds... ")time.Sleep(5 * time.Second)fmt.Printf("Stop notification... \n")    //关闭过程fmt.Println("==========关闭过程============")signal.Stop(sigRecv1)signal.Stop(sigRecv2)close(sigRecv1)close(sigRecv2)fmt.Printf("done. [sigRecv1]\n")//调用Wait方法,直到差量为0 的时候完成。wg.Wait()}
  • 输出

等待5秒的时间里,我们按 Ctrl+C向程序发送停止信号,现象为:

  • 携程1 打印出了结果
  • 携程2因为使用的是信号组2,而信号组2中没有中断信号,因此不会打印出来。
==========创建过程============Set notification for [interrupt quit]... [sigRecv1]Set notification for [quit]... [sigRecv2]==========实验开始============Wait for 5 seconds...^CReceived a signal from sigRecv1: interrupt^CReceived a signal from sigRecv1: interrupt^CReceived a signal from sigRecv1: interruptStop notification...==========关闭过程============done. [sigRecv1]携程2   End. [sigRecv2]携程1  End. [sigRecv1]

2. 向进程发送信号

  • 根据pid获取进程
proc,_ := os.FindProcess(pid)
  • 给进程发送信号
err = proc.Signal(syscall.SIGINT)
  • 示例
import ("os""syscall")func signal02(pids []int,signal syscall.Signal)error{for _,pid := range pids{proc,_ := os.FindProcess(pid)err := proc.Signal(signal)if err != nil{return err}}    return nil}