HTTP服务器server程序信号处理—StateThreads示例程序介绍

server 程序默认会开多进程,这里面有一个父级进程 与 多个子进程。但是无论是 父进程 还是 子进程,他们都需要处理信号。

server 程序的信号处理也是非常值得学习的模块。他里面用 pipe() 把 信号事情 转换成了 IO 事件,这样就可以 select/epoll_wait 来监控 IO 事件了。

信号处理相关的基础知识可以看《Unix环境高级编程》,我这里只是简单介绍一下信号函数。当一个进程收到一个信号的时候,就会调 某个信号处理函数,例如 child_sighandler()

你可以这样理解信号处理,信号处理实际上就是进程的代码 机器码突然跳转到 child_sighandler() 函数运行。因为信号能在进程的任何状态下发生,所以相当于在任何时刻都可以插入了 child_sighandler() 函数的机器码代码段。

当然我用 插入 这个词不太准确,但是你可以这么理解。他就是一个跳转,在某个时候插入了一段代码。


父级进程的信号处理函数是 wdog_sighandler(),子进程 的信号处理函数是 child_sighandler()

1,child_sighandler 子进程信号处理分析

子进程会先调 pipe() 创建两个 fd,这两个 fd 一个是用来写数据的,一个是用来读数据的,如下:

关于 pipe() 的具体用法,还是请阅读《Unix环境高级编程》,本文不讲解这部分的内容。

利用 pipe() 创建的两个 fd,就可以实现 信号事情 转 IO 事件,技巧就在 child_sighandler() 里面,如下:

ini 复制代码
static void child_sighandler(int signo) {
    int err, fd;

    err = errno;
    fd = st_netfd_fileno(sig_pipe[1]);

    /* write() is async-safe */
    if (write(fd, &signo, sizeof(int)) != sizeof(int))
        err_sys_quit(errfd, "ERROR: process %d (pid %d): child's signal"
                            " handler: write", my_index, my_pid);
    errno = err;
}

当有信号来的时候,他就会 通过 fd 把信号 写入 pipe 管道。但是疑问又来的,谁来读这个 pipe 管道呢?

答:始祖协程。没错,每一个进程在创建完 handle_connections() 协程之后,他的 main() 会变成处理 信号的始祖协程,如下:

st_read() 函数会阻塞读取 管道 fd,阻塞实际上就是切换到其他协程运行,之前已经讲过了。


子进程支持 3 种信号。

  1. SIGHUP,这个信号可以 重新加载配置文件 跟 刷新 error 日志。虽然他的 load_configs() 是个空函数。kill -s HUP pid 可以发送 SIGHUP 信号
  2. SIGTERM,强制退出进程。kill -s TERM pid 可以发送 SIGTERM 信号
  3. SIGUSR1,用户自定义信号,可以打印当前子进程的信息。kill -s USR1 pid 可以发送 SIGTERM 信号

SIGUSR1 信号挺有趣的,我们可以试一下:

bash 复制代码
kill -s USR1 28261

2,wdog_sighandler 父进程信号处理分析

父进程的任何信号都会转发给子进程,如下:

然后父进程本身也是支持 3 种信号,如下:

  1. SIGHUP,这个信号可以 刷新 error 日志。
  2. SIGTERM,强制退出进程。
  3. SIGUSR1,没有实现任何功能。

这就是 HTTP 服务器 server 程序的信号处理 模块,讲解完毕。


本文是《 SRS原理 》一书中的文章,如需观看更多内容,请购买本书。

相关推荐
代码小学僧2 天前
从 0 到 1,记录我的第一个出海 SaaS 独立开发项目
前端·rpc·音视频开发
贾伟康3 天前
【HarmonyOS 7新能力|041】弱网直播优化工程封装:把接入逻辑放进可维护的分层结构
性能优化·harmonyos·arkts·音视频开发·直播
用户38034165882975 天前
Broadcast Extension 里的 Live Activity:一次跨进程妥协
ios·音视频开发
用户38034165882976 天前
macOS 录屏:ScreenCaptureKit 与 iOS 的分野,共用引擎的抽象层该切在哪
ios·音视频开发
用户38034165882978 天前
FFmpeg 在 iOS 上的裁剪、集成与包体控制
ios·音视频开发
花椒技术9 天前
把 AI 视频接进直播:提前生成、按次生成、持续生成怎么选?
agent·音视频开发
老孙讲技术9 天前
把连锁门店轮询抓拍和遮挡叫醒接进督导台-setDeviceSnapEnhanced与setMessageCallback
后端·物联网·音视频开发
用户380341658829712 天前
手写 fMP4 muxer:从 ISO 14496-12 到能播的文件
ios·音视频开发
字节跳动视频云技术团队13 天前
火山引擎 AI MediaKit X 懂车帝,探索汽车内容智能创作新方式
人工智能·音视频开发
老孙讲技术16 天前
【监控开发】把车间未戴帽和烟火报警接进安监值班群:workwearDetect 对图与 setMessageCallback 订 smokeAlarm
后端·物联网·音视频开发