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

@

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

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

func Signal01() {
//01 创建过程
fmt.Println("==========创建过程============")
//创建一个通道1
sigRecv1 := 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传入通道2
sigRecv2 := 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的差量 -1
wg.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: interrupt
Stop 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
}

posted on   运维开发玄德公  阅读(19)  评论(0编辑  收藏  举报  

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示