`
nil-zhang
  • 浏览: 50874 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

linux后端服务程序之信号处理

阅读更多
 
      信号就是通知某个进程发了某个事件,也称为软件中断。信号提供了一种处理异步事件的方法。信号通常是异步发生的,进程预先不知道信号准确发生的时刻。后端程序(daemon)往往需要提供7*24不间断的服务,因此,编程daemon程序时对信号的正确处理尤为重要。下面和大家分享编写daemon程序时信号处理的注意事项,内容都来自Internet,只是进行了整理和总结。关于信号的基础知识请参考APUE。

常见的信号

  SIGHUP1和终端的连接断开,发送该信号给控制进程。通常用此信号来通知daemon重新读取配置文件(因为daemon不会有控制终端,通常不会收到该信号)。
SIGINT2用户中断(Ctrl + C)。
SIGABRT6调用abort函数产生(通常是自杀)。
SIGKILL9可以杀死任意进程,不能被捕获或忽略(俗称酒杀)。
SIGSEGV11无效的内存引用(segmentation fault)。
SIGPIPE13对于socket fd,当一个进程向某个已经收到RST的fd执行写操作时,内核会向该进程发送该信号。
SIGTERM15kill命令发送的默认终止信号。
SIGCHLD17进程终止时向其父进程发送的信号。
SIGPROF27使用gprof工具测试时会收到该信号。

别用signal,用sigaction

可以通过signal或者sigaction函数来设置信号处理函数,但signal函数太过古老,因此推荐使用sigaction。理由如下:
1. sigaction可以提供更多接收到信号的信息。
2. 调用完信号处理函数后重新设置处理函数不会对sigaction有影响,因为sigaction默认是不会去重置处理函数的,同时在执行处理函数会屏蔽掉该信号,也不会有竞争。
3. signal函数在某些系统中会默认重启被中断的系统调用,而sigaction默认不会这样做。
4. signal函数在多线程环境中的行为是未定义的,必须使用sigaction函数。

数据传输和信号

使用了系统调用的函数都有可能被信号中断,立刻返回的函数(不需要等待I/O操作的完成或sleep)不会被中断,而需要等待的函数(等待网络传输,管道的读或者sleep)将会被中断,比如select, read, connect。
在daemon程序中,恰当地处理被中断的系统调用是非常重要的。如果read, write等传输数据的函数被中断,必须处理这种情况并恢复数据的传输。有两种被中断的场景:
1. 当没有数据传输时就被中断,函数返回-1,这时可以通过判断errno的值来识别这种错误,如果errno == EINTR,则表示函数在没有任何数据传输的情况下就被中断,这时可以通过同样的参数来再次调用该数据。
2. 另一种情况是数据传输已经在进行,但在没有完成之前被中断;这种情况下函数不会返回错误,而是返回一个小于期望大小的值,同时errno也不会有错误设置,想识别这种情况只能捕获导致中断的信号。在中断之后恢复数据传输时一定记得部分数据已经被传输,必须从正确的偏移再次发起传输。
不要通过sigaction函数设置SA_RESTART来处理被中断的系统调用。

多线程和信号

多线程程序的信号处理和单线程程序有很大的区别。根据POSIX规范,一个多线程的程序只有一个进程和一个pid,哪个线程会被中断并处理到达的信号呢?有两种情况:
发送给进程的信号 比如用kill向一个pid发送信号,每个线程都有单独的信号掩码,可以通过pthread_sigmask来设置。信号不会分发给已经屏蔽了该信号的线程,而是在没有屏蔽该信号的线程中任选一个来接收,但没有指定哪个线程一定可以接收到。如果所有的线程都屏蔽了该信号,该信号将在预处理队列中排队。
发送给线程的信号 pthread_kill可以用来向指定的线程发送信号,分发和排队都是线程级别的。如果没有指定信号处理函数,而默认是结束进程,发送给线程的信号也会导致整个进程退出。
不要在信号处理函数中使用锁。

同步化信号处理 signalfd

signalfd是一个在linux kernel 2.6.22提供的系统调用,功能是使用一个fd来接收信号。这样就可以同步地处理信号,也不需要设置处理函数。可以man signalfd 查看示例程序。首先必须使用sigprocmask来屏蔽要使用signalfd来处理的信号,然后调用signalfd创建一个fd用来读取到达的信号。当被屏蔽的信号到达时,程序将不会被中断,也不会有处理函数被调用。信号会在fd中排队。signalfd创建的fd可以和其他fd一样:可以放在select, poll, epoll中;可以设置为非阻塞;可以为不同的信号创建不同的fd;在fork之后该fd也不会关闭掉,子进程同样可以读懂发送给父进程的信号。signalfd非常适合在主循环中执行epoll处理大量连接的单进程网络服务程序中使用,信号的处理可以和其他fd一样加到epoll中。由于程序不会被中断,可以选择合适的时机才去处理信号。
 
0
0
分享到:
评论

相关推荐

    运用 Node.js-Koa 来开发小程序项目的后端接口.zip

    运用 Node.js-Koa 来开发小程序项目的后端接口 软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS...

    Linux 应用开发流程详细笔记

    例如,文件操作(open, read, write, close),进程管理(fork, exec, wait),信号处理,内存管理等。 2. **网络通信**:在智能仓库的场景中,无线连接是关键。Linux支持多种网络协议栈,如TCP/IP,UDP等。开发者...

    C/C++ Linux服务器开发

    这份资料可能是关于Linux系统编程的基础知识,包括对文件操作、进程控制、信号处理、内存管理等基础知识的介绍。学习这部分内容是理解Linux环境下的程序运行机制的基础,同时为后续的网络编程打下坚实的基础。例如,...

    后端网络框架学习必备:libevent源码剖析

    这种设计允许程序以非阻塞的方式处理大量并发事件,显著提高了系统的并发处理能力。libevent提供了一组API,使得开发者可以方便地注册事件处理器,当相应的事件发生时,libevent会调用对应的回调函数进行处理。 在...

    nginx1.20.1Linux版.zip

    总结,Nginx 1.20.1 Linux版是一个强大的Web服务器解决方案,它的高效、稳定和灵活性使其在各类网站和应用程序部署中备受青睐。正确配置和使用Nginx,可以显著提升网站性能,优化用户体验,并为复杂的分布式系统提供...

    PC键盘驱动程序源码分析

    在这个步骤中,当用户按键或释放键时,键盘会向系统产生中断信号,系统自动进入键盘中断服务函数处理。键盘中断服务函数 keyboard_interrupt() 会从键盘状态寄存器读取键盘状态,从键盘缓冲区读取数据,并根据读取的...

    基于嵌入式Linux的网络视频监控系统的研究学士学位毕业论文.doc

    视频采集是视频监控系统的核心组件之一,负责将视频信号采集并传输到后端服务器。视频采集设备可以是摄像头、摄像机等。在本研究中,USB接口的摄像头被选择作为视频采集设备,用于采集视频信号。 知识点5:视频压缩...

    后端采用python的一款web框架Django进行开发.zip

    一款活动发布,活动报名的微信小程序,包含前后端源码,后端采用python的一款web框架Django进行开发,且使用了缓存和redis,运行项目后端程序前,请确保您已经安装和启动了redis服务器! 软件开发设计:应用软件开发...

    「已弃用,不兼容新版前端」Artalk 评论系统后端程序 PHP 版.zip

    网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络与通信是一个非常广泛的领域,它涉及到计算机科学、电子工程、数学等多个学科的知识。 云计算与大数据:包括云计算平台、大数据分析、人工...

    万岳直播商城系统服务web端,后端web+前端ios、android.zip

    万岳直播商城系统服务web端,后端web+前端ios、android,适用于直播商城、短视频商城、社区商城、知识付费等形式,该开源版包含多商户入驻、直播带货、主播分销、电商商城等功能,后续将继续开源小程序端,欢迎关注...

    jpeg-encode.zip_jpeg_jpeg encode_jpeg encode linux_linux视频监控_视频监

    “linux视频监控”和“视频监控”标签暗示了这个压缩包的内容可能与视频处理和监控系统的后端编码流程有关。在视频监控系统中,前端摄像头捕捉视频流,然后通过网络发送到后端服务器,服务器负责接收、解码、编码...

    ARM和LINUX的应用,很难找的额

    1. 图像采集:通过摄像头或其他图像传感器获取视频信号,然后由ARM处理器进行数字化处理。ARM芯片内置的多媒体加速器可以快速处理图像编码和压缩任务。 2. 视频编码:使用如H.264、MPEG-4等高效编码标准,将连续的...

    在linux环境下QT制作音乐播放器

    以上知识体系涵盖了从界面设计到后端逻辑的实现,是Linux环境下使用QT制作音乐播放器所需的主要技能。通过实践这个项目,开发者不仅可以提升QT编程能力,还能加深对Linux操作系统和音频处理的理解。提供的"播发器...

    Qt及Linux操作系统窗口设计

    Qt的信号和槽机制是其核心特性之一,它允许对象之间进行通信,简化了事件处理的编程模型。 此外,Qt还支持国际化和本地化,使得应用程序能够适应不同的语言和文化环境。通过Qt Linguist工具,开发者可以方便地添加...

    高性能高并发事件处理框架Libevnt

    通过监听客户端的连接请求,使用非阻塞I/O处理数据读写,配合定时器实现缓存项的过期检查,以及使用信号事件处理系统或应用程序的异常情况。 总结来说,Libevent作为一个高性能事件处理框架,通过其高效、灵活的...

    linux环境下的qt4图形界面与mysql编程的源代码

    在Linux环境中,Qt4是一个强大的C++库,用于构建图形用户界面(GUI)应用程序。它以其丰富的组件、灵活的设计和跨平台能力而受到开发者们的欢迎。Qt4支持多种操作系统,包括Linux、Windows和macOS等,这使得开发的...

    毕设:基于stm32+树莓派+springboot的小程序智能家居控制系统设计与实现.zip

    在本项目中,Spring Boot将用于构建后端服务器,处理来自小程序的请求,控制树莓派的执行逻辑,以及与STM32进行数据交换。开发者需要掌握Java编程语言,理解Spring框架的核心概念,如依赖注入、AOP(面向切面编程)...

    仿小米商城全栈项目,包括mobile web, 微信小程序,React Native, SSR, Node后端 .zip

    网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络与通信是一个非常广泛的领域,它涉及到计算机科学、电子工程、数学等多个学科的知识。 云计算与大数据:包括云计算平台、大数据分析、人工...

    微信小博客:无博客后端,博客数据来源与 hexo 与github 搭建的博客系统 .zip

    微信小博客:无博客后端,博客数据来源与 hexo 与github 搭建的博客系统 基于uni-app、colorUi、uView,支持小程序、H5、Android和IOS 软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发...

    zhda-qt-vue前台系统没有后端的可以使用还挺好看的.zip

    没有后端的部分可能意味着它是基于静态数据或模拟数据运行的,或者利用了第三方服务来处理数据交互。 在深入探讨这个项目之前,我们先了解一下Qt和Vue.js的基础知识: **Qt**: 1. **跨平台**:Qt支持Windows、...

Global site tag (gtag.js) - Google Analytics