捕获异常消息Ctrl+C

捕获异常消息,并报告消息类型

package main

import (
    "fmt"
    "runtime"
    "time"

    "github.com/silentred/gid"
    //"log"
    "os"
    "os/signal"
    "syscall"
)

func RegisterSignalHandler() chan os.Signal {
    c := make(chan os.Signal, 1)
    //signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT, syscall.SIGSTOP)
    signal.Notify(c, os.Interrupt, os.Kill)

    // s := <-c
    // fmt.Println("Got signal:", s)

    return c
}

func SignalHandler(c chan os.Signal) {

    // Block until a signal is received.
    for {
        s := <-c
        switch s {
        case syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGSTOP:
            fmt.Printf("SIGQUIT  [#%d] ", gid.Get())

        case syscall.SIGINT:
            fmt.Println("enter  syscall.SIGINT")
        case syscall.SIGHUP:
            fmt.Printf("SIGHUP   [#%d] ", gid.Get())

        default:
            fmt.Printf("default  [#%d] ", gid.Get())

        }
    }

}

func main() {

    sc := RegisterSignalHandler()
    go SignalHandler(sc)

    runtime.GOMAXPROCS(2)

    var i int
    fmt.Printf("main goroutine   [#%d] ", gid.Get())
    for {

        time.Sleep(1 * time.Second)

        fmt.Println(i)

        i++
    }

}

捕获Ctrl+C并强制退出程序

func main() {
    c := make(chan os.Signal, 1)
    //signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT, syscall.SIGSTOP)
    signal.Notify(c, os.Interrupt, os.Kill)

     s := <-c
    fmt.Println("Got signal:", s)

}
在终端或命令行界面中,`Ctrl+C` 和 `Ctrl+D` 是两个常用的控制字符,它们分别用于发送特定的信号给当前运行的程序。在 Linux/Unix 系统中,它们的行为是由终端驱动程序和应用程序的信号处理机制决定的。 ## 1. `Ctrl+C` 的逻辑处理 - `Ctrl+C` 会发送 **SIGINT(中断信号)** 给前台进程组。 - 默认行为是终止进程。 - 程序可以捕获或忽略这个信号,从而实现自定义处理逻辑。 ### 示例代码(Python): ```python import signal import time def signal_handler(sig, frame): print('你按下了 Ctrl+C!') print('正在优雅退出...') exit(0) # 注册信号处理函数 signal.signal(signal.SIGINT, signal_handler) print('按下 Ctrl+C 来触发中断信号') while True: time.sleep(1) ``` ### 解释: - `signal.signal(signal.SIGINT, signal_handler)`:将 `SIGINT` 信号绑定到我们自定义的 `signal_handler` 函数。 - 当用户按下 `Ctrl+C`,程序不会立即退出,而是先打印提示信息,再退出。 - 这种机制常用于服务器、守护进程等需要优雅关闭的场景。 --- ## 2. `Ctrl+D` 的逻辑处理 - `Ctrl+D` 表示 **EOF(End Of File)**,它不是发送信号,而是向标准输入发送一个 EOF 标记。 - 它通常用于通知程序输入结束。 - 在交互式 shell 中,`Ctrl+D` 通常会退出当前 shell 会话。 - 在 Python 的 `input()` 或 C 的 `fgets()`、`read()` 等函数中会返回 EOF。 ### 示例代码(Python): ```python print("请输入一些内容,按 Ctrl+D 结束输入(Windows 上是 Ctrl+Z)") try: while True: line = input('> ') print(f'你输入的是: {line}') except EOFError: print('\n检测到 EOF,程序结束') ``` ### 解释: - 当用户按下 `Ctrl+D`,`input()` 函数会抛出 `EOFError`。 - 程序捕获异常后可以执行清理操作或退出。 - 注意:在 Windows 中,`EOF` 是通过 `Ctrl+Z` 实现的。 --- ## 总结对比 | 控制键 | 作用 | 默认行为 | 机制 | 可否被捕获 | |--------|------|-----------|------|-------------| | `Ctrl+C` | 发送中断信号 | 终止进程 | 信号机制 (`SIGINT`) | 可以被程序捕获和处理 | | `Ctrl+D` | 输入结束标记 | 结束输入流 | 文件结束符 (EOF) | 不是信号,需程序检测 EOF | --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值