信号打断read()函数、accept()函数

2020-12-07  本文已影响0人  StevenHD

一、信号打断read()函数

图示代码

二、信号打断accept()函数

被信号打断并不可怕,我们只要设置成,万一被打断了,重启一次就行,这样就没有事

accept()被打断后的处理
我们可以让它continue,另一种就是设置【信号中的RESTART】——
信号中的重启

三、复习review

复习大纲
复习大纲2

四、错误值封装

先从缓存中读取数据,然后读取文件描述符(套接字)中的数据

五、多进程服务器

多进程模型1 多进程模型2

子进程中的client_fd是从父进程中拷贝过来的,使用这个复制过来的套接字client_fd并读取数据,并且和父进程中的client_fd指向的是同一个套接字socket。

图示代码
图示代码2

所以除了阻塞轮询的方式,我们只能使用【信号waitpid()】这种方式了——

这样就不会出现僵尸进程了
这样就不会出现僵尸进程了
为什么使用SIGCHLD这个信号呢?因为当子进程退出的时候会发给父进程信号SIGCHLD,所以我们需要捕捉的就是这个信号。

因为fork()后不论是listen_fd还是client_fd都会被复制,但是listen_fd并没有再被使用,所以要在一开始就关闭掉listen_fd——

图示代码关闭listen_fd
图示代码——父进程也要关闭client_fd

5.1 服务器不光读也可以写消息给客户端

增加了Write()函数
增加了write()和read()函数

多进程模型的好处:可以不断地创建子进程来处理连接请求,可以通过ulimit -a来查看可以创建多少个进程数量

最大进程数量

虽然多进程都是fork出来的,但是比如buf这种缓存区中接收到的内容,因为读时共享,写时复制的原则,buf区中接收到的数据一定是不一样,那么系统会新分配一个内存页的。

上一篇 下一篇

猜你喜欢

热点阅读