这篇博客记录一下我在编写一个简单的多进程回声服务器的时候出现的问题。 这个问题就在于忽略了几个有关于信号处理函数的基本常识:
下面是我所写的代码中的一个片段(C和C++混编出来的屎,别喷):
这段代码会有两个地方陷入阻塞:一是父进程调用accept时,二是子进程调用read时。而子进程并没有调用信号注册函数,因此子进程与本篇文章研究的问题无关。 这段代码的意思大概是这样:调用start()后,调用sigaction()注册了一个SIGCHLD信号,然后继续往下走直到accept()阻塞。如果accept()返回了一个正确的套接字,那么主进程就创建一个子进程去处理I/O。子进程当中的read()如果返回值为0,就说明连接已经断开了,此时子进程就会退出。同时,在子进程处理I/O的时候,父进程已经在accept()处阻塞了,此时如果子进程处理的I/O连接断开,子进程就会退出,父进程就会收到SIGCHLD信号,然而此时的父进程正处于阻塞状态,所以操作系统会强制唤醒父进程以便调用信号处理函数,而父进程的accept()没有收到任何可用连接并且又从accept()处唤醒,因此accept()的返回值为-1,所以会打印一个"accept error!"。 虽然这段代码并不会给服务器带来任何功能上的差错,但是一个连接断开就打印一次"accept error!"确实是比较奇怪的。因此写下该篇文章以做记录。 |
原文地址:https://blog.csdn.net/weixin_59913110/article/details/131629303
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://www.msipo.com/article-1077.html 如若内容造成侵权/违法违规/事实不符,请联系MSIPO邮箱:3448751423@qq.com进行投诉反馈,一经查实,立即删除!
Copyright © 2023, msipo.com