`
nil-zhang
  • 浏览: 51628 次
  • 性别: 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等。开发者...

    基于嵌入式Linux的Qt图形程序实战开发

    Qt框架提供了一整套事件处理机制,包括事件过滤器、信号和槽机制等,使得开发者可以很容易地实现复杂的用户交互逻辑。 知识点六:嵌入式Linux系统下的性能优化 在嵌入式设备上运行的图形程序可能需要面对有限的硬件...

    Linux高性能服务器编程

    后端开发人员需要掌握系统调用的使用,这包括文件操作(如读写文件、文件锁、内存映射等)、进程控制(如创建和终止进程、信号处理、管道和套接字通信等)、以及线程控制(如创建和管理线程)等。 其次,多线程编程...

    后端程序员必备的 Linux 基础知识 常见命令.docx

    对于后端程序员来说,掌握Linux基础知识至关重要,因为许多服务器都运行在Linux系统上。了解和熟练使用Linux命令行能提高工作效率,例如: - `ls`:列出目录内容。 - `cd`:改变当前工作目录。 - `mkdir`:创建新...

    C/C++ Linux服务器开发

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

    后端面试题目的总结

    ### 后端面试知识点总结 ...- **信号处理**:熟悉常见信号如SIGINT, SIGTERM, SIGKILL等,并了解如何处理这些信号。 以上总结了后端面试中涉及的一些关键知识点和技术细节,希望对准备面试的同学有所帮助。

    2022米哈游-平台后端笔试.docx

    当程序执行到某个错误点时,可以通过抛出异常(`throw`),然后在适当的上下文中捕获(`catch`)并处理该异常,从而避免程序崩溃。 ### 代码分析 代码分析是指对源代码进行静态或动态检查的过程,目的是发现潜在的错误...

    后端网络框架学习必备: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,适用于直播商城、短视频商城、社区商城、知识付费等形式,该开源版包含多商户入驻、直播带货、主播分销、电商商城等功能,后续将继续开源小程序端,欢迎关注...

    嵌入式Linux 下的Qt通讯簿程序设计.pdf

    嵌入式Linux下的Qt通讯簿程序设计是针对嵌入式系统开发领域中一个非常具体的应用案例,主要介绍了在Linux环境下如何利用Qt框架开发图形用户界面应用程序。Qt是一个跨平台的C++应用程序框架,它提供了一整套的库和...

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

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

Global site tag (gtag.js) - Google Analytics