前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用信号进制实现进程通信

使用信号进制实现进程通信

原创
作者头像
暮雨
修改2019-08-19 17:31:06
1.1K0
修改2019-08-19 17:31:06
举报
文章被收录于专栏:云端漫步云端漫步

进程间通信方式

学习操作系统的原理,我们知道,进程间通信有以下几种方式:

  • 管道(pipe)
  • 信号(signal)
  • 消息队列
  • 共享内存
  • 信号量
  • 套接字(socket)

而在应用系统开发中,我们常用的方式就是消息队列和套接字两种方式。在程序中写了一个死循环,运行时,常使用<code>ctrl+c</code>来中断进程。突然软件卡死了,我们无法关闭,这时,你知道使用kill -9 pip来结束进程。这些基本的操作常识性操作,背后就使用的“信号量"和应用程序发生通信。

信号

信号(Signal)是Linux, 类Unix和其它POSIX兼容的操作系统中用来进程间通讯的一种方式。一个信号就是一个异步的通知,发送给某个进程,或者同进程的某个线程,告诉它们某个事件发生了。

当信号发送到某个进程中时,操作系统会中断该进程的正常流程,并进入相应的信号处理函数执行操作,完成后再回到中断的地方继续执行。

如果目标进程先前注册了某个信号的处理程序(signal handler),则此处理程序会被调用,否则缺省的处理程序被调用。

这种方式只有事件类型,不能实现进程间数据传递。

发送信号

  • kill系统调用
  • kill命令用户发送信号
  • raise库函数发送信号给当前进程 也可以通过键盘发送特定命令实现发送信号,如 ctrl+c SIGINT ctrl+z SIGTSTP ctrl+\ SIGQUIT ctrl+T SIGINFO

信号处理

程序中可以设置接受信号,编写处理函数对信号进行拦截处理,信号有以下处理动作。

其中SIGKILL和SIGSTOP不能被程序所捕捉做拦截处理

在mac电脑下,在命令终端输入<code>kill -l</code>会列出所有的signal信息

HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CHLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH INFO USR1 USR2

通过信号实现守护进程退出提示

我们现要终止一个服务进程,在终止前,让取它打印让其做个倒计时的功能。那么怎么实现这个小功能呢?这就需要用到信号,通过kill发送终止信号,在程序中编写捕捉函数,在信号被触发时,执行捕捉函数。

package main

import (
	"fmt"
	"os"
	"os/signal"
	"syscall"
	"time"
)

func main() {
	c := make(chan os.Signal)
	signal.Notify(c, syscall.SIGINT)
	fmt.Println("启动服务")
	sig := <-c
	fmt.Println("收到信号", sig)
	TipMsg()

	sum := 0
	for {
		sum += 1
		time.Sleep(1 * time.Second)
	}
}

func TipMsg() {
	fmt.Printf("5秒后退出程序。。。")
	for i := 5; i > 0; i-- {
		time.Sleep(1 * time.Second)
	}
	fmt.Println("退出程序")
	os.Exit(0)
}

go run server.go启动服务,按下<code>ctrl+c</code>既可完成测试,也可以使用kill发送信号进行测试。方法

$go build 
$./server
//另开一个终端tab
$ps -ef | grep server
$kill 2 pid(服务的进程id)

使用信号量实现配置文件热加载

我们在写程序时,常常将一些可控的参数通过配置文件的方式进行加载。这些参数也经常需要动态的调整,那么修改了配置文件后,就需要重新的加载配置文件,就需要重启服务。借助信号量是不就可以达到配置文件重新加载的目的。基于上边的例子,我们将TipMsg的操作改为配置文件重加载的操作,然后将信号修改为SIGUSR1, 完成修改后,使用kill -USER1 pid即可完成配置的重新加载。

具体的实现可以参考这篇文章https://segmentfault.com/a/1190000019436438

参考:

https://colobu.com/2015/10/09/Linux-Signals/

https://www.jianshu.com/p/f445bfeea40a

喜欢请关注“云端漫记", 将持续为你更

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 进程间通信方式
  • 信号
  • 发送信号
  • 信号处理
  • 通过信号实现守护进程退出提示
  • 使用信号量实现配置文件热加载
相关产品与服务
消息队列 CMQ 版
消息队列 CMQ 版(TDMQ for CMQ,简称 TDMQ CMQ 版)是一款分布式高可用的消息队列服务,它能够提供可靠的,基于消息的异步通信机制,能够将分布式部署的不同应用(或同一应用的不同组件)中的信息传递,存储在可靠有效的 CMQ 队列中,防止消息丢失。TDMQ CMQ 版支持多进程同时读写,收发互不干扰,无需各应用或组件始终处于运行状态。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档