一、课程信息
打卡时间:2022.8.5
课程名称:C/C++气象数据中心实战,手把手教你做工业级项目
章节名称:开发基于tcp协议的文件传输子系统 4-4、4-5、4-6、4-7
讲师: 长歌_吴从周
二、今日课程
课程内容:(1)搭建多进程的网络服务程序架构(2)TCP短链接/长连接和心跳机制
三、学习心得
搭建多进程的网络服务程序架构
一般的多进程网络服务器程序流程是这样的,父进程在初始化服务器后开始监听指定的端口,当收到TCP连接后,父进程fork出子进程用于处理业务,随后父进程继续保持监听状态。这说明了TCP服务器的父进程可以有多个处理不同业务的子进程。程序流程虽然较为简单,但是有几个需要注意的地方:
1)僵尸进程
因为处理业务的子进程常常会先于父进程退出,如果子进程先退出,内核向父进程发送SIGCHLD信号,如果父进程不处理这个信号,子进程会成为僵尸进程(僵尸进程随着父进程的退出而消失)
僵尸进程的危害:如果子进程在父进程之前终止,内核为每个子进程保留一个数据结构,包括进程编号、终止状态和使用CPU时间等,父进程如何处理子进程推出的消息,内核就会释放这个数据结构,如果父进程没有处理子进程退出的信息,内核就不会释放这个数据结构,子进程进程编号就会一直被占用,但是系统的可用进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程,这就是僵尸进程的危害。
解决僵尸进程的三种方法:
(1)在父进程中忽略SIGCHLD信号
signal(SIGCHLD,SIG_IGN)
(2)在父进程中加入wait或者waitpid函数
但是wait会阻塞
(3)设置CHLD的处理函数
void func(int sig){
int sts;
wait(&sts);
}
signal(SIGCHLD,func);
2)在Linux中一切皆文件,由于子进程会拷贝父进程文件描述符的副本,因此当开启多个子进程时造成不必要的资源消耗。因此可以close父进程的connect_fd,close子进程的listen_fd。如果要查看指定进程的文件描述符信息可以:
cd /proc
cd 进程号
cd fd
父进程关闭自己的文件描述符是不会影响到子进程,同理子进程关闭自己的文件描述符是不会影响父进程的。
TCP短连接/长连接和心跳机制
TCP短连接较为简单,而长连接在连接建立后要一直保持,如何维持这一过程呢?
一般来说服务器端会设置客户端连接的超时时间,当客户端很长一段时间不向服务器发送消息后,服务器会关闭和客户端的连接,客户端需要加入心跳机制,每隔一段时间向服务器发送数据包以维持连接。secureCRT使用的反空闲功能就是这个道理。