如果是命令行程序需要退出, CTRL+C是最直接的方法.

C语言如何处理CTRL+C

CTRL+C会向命令行进程发送中断信号, 在C语言的中的signal函数可以注册信号的处理函数.

signal函数的签名如下:

void (*signal(int sig, void (*func)(int)))(int);

比如, 我们要处理CTRL+C对应的SIGINT信号:

#include

#include

#include

void sigHandle(int sig) {

switch(sig) {

case SIGINT:

printf("sigHandle: %d, SIGINTn", sig);

break;

default:

printf("sigHandle: %d, OTHERn", sig);

break;

}

exit(1);

}

int main() {

signal(SIGINT, sigHandle);

for(;;) {}

return 0;

}

编译并运行程序后会进入死循环, 按CTRL+C强制退出会看到以下的输出:

sigHandle: 2, SIGINT

当然, 直接从进程管理杀死程序就没办法收到信号的.

中除了signal函数, 还有一个raise函数用于生成信号:

int raise(int sig);

我们在sigHandle截获信号之后如果想重新恢复信号, 可以使用raise函数. 但是, 要注意不要导致无穷递归signal/raise调用.

Go语言如何处理CTRL+C

Go语言也有类似的函数signal.Notify(在os/signal包中), 可以过滤信号.

这是signal.Notify自带的例子:

// Set up channel on which to send signal notifications.

// We must use a buffered channel or risk missing the signal

// if we're not ready to receive when the signal is sent.

c := make(chan os.Signal, 1)

signal.Notify(c, os.Interrupt, os.Kill)

// Block until a signal is received.

s :=

fmt.Println("Got signal:", s)

signal.Notify会将用户关注的信号转发到信道c, 信道c不能是阻塞的. 如果信道是缓冲不足的话, 可能会丢失信号. 如果我们不再次转发信号, 设置为1个缓冲大小就可以了.

signal.Notify从第二个参数起是可变参数的, 用于指定要过滤的信号.

如果不指定第二个参数, 则默认是过滤全部的信号.

信号的定义一般在syscall. syscall包是系统相关的,

不同的操作系统信号可能有差异. 不过syscall.SIGINT和syscall.SIGKILL各个系统是一致的, 分别对应os.Interrupt和os.Kill.

下面是Go语言版完整的例子:

package main

import (

"fmt"

"os"

"os/signal"

)

func main() {

c := make(chan os.Signal, 1)

signal.Notify(c, os.Interrupt, os.Kill)

s :=

fmt.Println("Got signal:", s)

}

go run signal.go运行后会进入死循环, 按CTRL+C强制退出会看到以下的输出:

Got signal: interrupt

当然, 直接从进程管理杀死程序就没办法收到信号的.

如果要恢复信号, 调用s.Signal(). 如果要停止信号的过滤, 调用signal.Stop(c).

c语言如何直接强制退出程序,Go程序如何安全退出(CTRL+C)-Go语言中文社区相关推荐

  1. java 线程强制退出程序_Java程序在线程完成之前退出。我如何让Cucumber-JVM等待线程退出?...

    然后,一个线程应该做一些事情,而最初的主线程继续贯穿黄瓜步骤. 程序不应该退出,直到所有线程都完成. 我遇到的问题是主程序在线程完成之前退出. 这里发生的事情: 输出/问题 主程序是RunApiTes ...

  2. 易语言 vb c 那个写的程序运行快,VB好还是易语言

    满意答案 Zack_gb 2014.07.10 采纳率:53%    等级:8 已帮助:413人 其实编程语言都差不多的.易语言显得更简单些.易语言与VB一样是事件驱动的语言.我们在写代码时显得比C\ ...

  3. 扁平化c语言教程,中国象棋人机博弈程序(扁平化棋局) C语言实现

    平台是Visual studio 2013 windows8.1  64位 先来一个效果图吧,原先是挺清晰的,但是200K以上不能上传,所以搞模糊了,这个界面是扁平风格的,个人感觉不错,很佩服作者,我 ...

  4. 用c语言编写实心菱形,C语言编写内置菱形的程序

    C语言编写内置菱形的程序 最近迷上了用C语言编写图形的输出程序,有矩形的.三角形.等腰三角形,平行四边形.菱形.沙漏形.今天尝试着将菱形内置到矩形中,结果成功了,下面将快乐分享给大家,也希望广大C程序 ...

  5. 使用Go语言交叉编译开发嵌入式Linux应用程序

    文章目录 目的 基础说明 编译生成嵌入式Linux应用程序 二进制文件瘦身 与C语言混合进行开发 总结 目的 Go语言非常适合用来开发存储空间不紧张的嵌入式Linux设备应用程序,可以在性能需求和开发 ...

  6. c语言 强制退出程序,C#实现点击按钮退出应用程序实例

    最近在做一个程序,要求先登陆后再进入界面.因此,若是用户取消登陆,则要退出应用程序. 注意,用于重新设计了登陆界面,FormBorderStyle设置的为None,因此窗体右上角并没有关闭的按钮,按照 ...

  7. mac 强制退出程序_强行退出Mac上应用程序的6 种方法

    虽然Mac os系统很流畅,但是我们在使用的时候偶尔会出现一些软件与系统不兼容情况.或者一些不良应用在我们使用的时候突然就卡主了,这时我们要么等应用恢复响应,或者干脆强制退出它,小编这里为你介绍6种快 ...

  8. mac 强制退出程序_Mac OS系统如何强制退出应用程序

    Mac OS系统虽然非常稳定,但有时候也会受到不良APP影响,或者软件与系统不兼容等等,难免会遇到程序卡住,就需要强制退出这个程序了,下面是Mac OS里强制退出应用程序的六种方法. 使用键盘快捷键强 ...

  9. python语言的特点强制可读_python程序语言设计第二讲(笔记)

    Python语言程序设计第二讲 1.复习回顾 1.1保留字 1.2温度转换 #宋宇婕宝贝开始编写的第一个程序,温度转换,我来了 TempStr=input("一阵给老子输入带有符号的温度值, ...

最新文章

  1. 《游戏设计师修炼之道:数据驱动的游戏设计》一1.4小结
  2. 记于2014-12-9
  3. python语音在线编辑-Python实时语音识别控制
  4. weex前端式写法解决方案---eros
  5. java ee基础知识_Java EE:基础知识
  6. 面试突击 | Redis 如何从海量数据中查询出某一个 Key?视频版
  7. python md5函数_python实现md5加密
  8. 卷积神经网络训练准确率突然下降_基于联邦学习和卷积神经网络的入侵检测方法...
  9. 无缓冲I/O与有缓冲I/O区别
  10. linux离线安装yum源
  11. oracle sql 正则表达式
  12. mtk平台sensor分析一:alsps框架下的光距感驱动流程
  13. Meta 开源首个 AI 语音翻译系统,闽南话和英语可以直接语音互译
  14. 【钉钉-场景化能力包】考勤统计
  15. 设置计算机屏幕保护程序,电脑屏保怎么设置?一键设置电脑屏幕保护方法
  16. 关于微信授权登录的用户取消-2的问题
  17. Gradle入门(五)——Gradle其它模块与Plugin插件详解
  18. JZOJ5424. 【NOIP2017提高A组集训10.25】凤凰院凶真
  19. 女人也真不容易(续)——37度男人
  20. 计算成绩平均分浮点数c语言,C实验四

热门文章

  1. 图解 | 为什么HTTP3.0要弃用TCP协议,而改用UDP协议?
  2. 我的周刊(第021期)
  3. 【模型训练】yolov7安全帽检测
  4. 资深玩家如何通过tiktok月入十万
  5. 数字化新零售电商:阿里与腾讯的行业布局
  6. Spring-2.0.0.M3超详细文档(第一弹)
  7. Vue中的 h 函数
  8. 华为云计算HCIA学习笔记-第1章 云计算基础概念
  9. Spire.Office.NET Crack,提供免费的高质量组件
  10. 我们拜的“财神”到底是谁?