继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【学习打卡】第3天 多进程的网络服务端

weixin_慕斯636612
关注TA
已关注
手记 34
粉丝 2
获赞 15

一、课程信息

打卡时间: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使用的反空闲功能就是这个道理。

四、课程学习截图图片描述图片描述

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP