专栏中心

EEPW首页 > 专栏 > Linux下C/C++程序处理Ctrl+C的例子

Linux下C/C++程序处理Ctrl+C的例子

发布人:电子禅石 时间:2022-03-29 来源:工程师 发布文章

遇到一个场景:程序要读入文件,而用户在使用文件时是用/dev/urandom重定向作为输入的。(好吧这个用户就是测试我们作业的助教……)而/dev/urandom显然是没有EOF的,只有用Ctrl+C的方法结束输入。但是Ctrl+C也会同时结束程序,造成不用刻预测的结果。


因此,程序必须设法获知Ctrl+C的发生并进行处理。在Linux下,按下Ctrl+C后,程序会收到一个信号SIGINT;这时操作系统默认会结束程序。如果程序不想被默认处理,就要设置对SIGINT信号的处理函数(Handler)。下面是一个简单的例子:


#include <stdio.h>

#include <stdlib.h>

#include <signal.h> // signal functions

volatile sig_atomic_t flag = 0;

static void my_handler(int sig){ // can be called asynchronously

  flag = 1; // set flag

}

 

int main(){

  // Register signals 

  signal(SIGINT, my_handler); 

  //      ^          ^

  //  which-signal   |-- which user defined function registered

  while(1)  

    if(flag){ // my action when signal set it 1

        printf("\n Signal caught!\n");

        printf("\n default action it not termination!\n");

        flag = 0;

    }     

  return 0;

}

(来源:http://stackoverflow.com/questions/17766550/ctrl-c-interrupt-event-handling-in-linux)

如上面程序所示,一般是在一个循环中检测一个标志变量flag,而这个flag只在信号处理函数中改变。在这里,my_handler()函数会在Ctrl+C按下后被调用,并设置flag。注意,由于我们自己设置了Ctrl+C的处理函数,系统就不会再按默认行为结束程序了。因此flag的变化会在循环中被检测到,并作出响应。


需要注意的是,网上很多例子中出于演示的方便,在消息处理函数中使用printf()。这样是不安全的:设想程序在正常调用printf的过程中收到了Ctrl+C,那么信号处理函数就会再调用一次printf,这有有造成错误的可能。有一些函数经过专门的设计可以安全地在信号处理函数中使用。


具体的解释可以参考:Matthew N, Stones R. Beginning Linux Programming[M]. John Wiley & Sons, 2011. 中的 Chapter 11: Processes and Signals。



————————————————

原文链接:https://blog.csdn.net/THU_Wm/article/details/41191869


专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词: linux

相关推荐

Linus Torvalds 称谷歌工程师提交的 RISC-V 代码为“垃圾”,并表示它“让世界变得更糟糕”

嵌入式系统 2025-08-11

基于ARM的嵌入式Linux系统开发 下

视频 2009-10-22

ARM 开发板使用手册 在三星 S3C2410开发板上烧写linux

GeForce 590 驱动分支是首个不支持 GTX 9 和 10 系列 GPU 的分支——Linux 版本标志着定义时代显卡的终结

Linux就AI生成代码定下规则:允许Copilot类工具、拒绝劣质AI代码,错误由人类负责

嵌入式Linux优化:加快系统起动和应用起动的过程

视频 2009-10-22

由于英特尔裁员和公司重组,主要的英特尔 Linux 驱动项目正在消亡

FFT公司9200的板子的资料

基于ARM的嵌入式Linux系统开发 中

视频 2009-10-22

Linux中的fork与exec系列函数分析

嵌入式系统 2025-08-06

彻底告别486:Linux内核维护者正式移除英特尔486处理器支持

53年后,惠普于1972年推出的总线标准获得了稳定的Linux驱动——通用接口总线拥有惊人的8 MB/s带宽

Linux 今天 34 岁了

linux入门精华

基于ARM的嵌入式Linux系统开发 上

视频 2009-10-22

实时Linux技术:如何在嵌入式LINUX中应用实时特性

视频 2009-10-22

RK3506核心板SDK重磅升级,解锁三核A7实时控制新架构

2025-12-18

Kontron与Congatec合作开发安全的嵌入式Linux平台

U-BOOT 与 MontaVista Linux 的移植

更多 培训课堂
更多 焦点
更多 视频

技术专区