golang并发编程-01多进程编程-03信号
1.golang并发编程-01多进程编程-01概述2.golang并发编程-01多进程编程-02管道
3.golang并发编程-01多进程编程-03信号
4.golang并发编程-01多进程编程-04socket5.golang并发编程-02多线程编程-01线程概述6.golang并发编程-02多线程编程-02线程的同步7.golang并发编程-03-协程(Goroutine)概述8.golang并发编程-04-通道-01-基本使用/缓冲通道/非缓冲通道9.golang并发编程-04-通道-02-定时器、断续器10.golang并发编程-05-同步-01-锁的使用(sync包Mutex、RWMutex结构体的常用方法)11.golang并发编程-05-同步-02-条件变量(Cond结构体的常用方法)12.golang并发编程-05-同步-03-原子操作(atomic包)13.golang并发编程-05-同步-04-sync包的once、WaitGroup结构体的常用方法14.golang并发编程-05-同步-05-临时对象池(sync.Pool)@
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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了