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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄德公笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值