特点
同一时刻可以响应多个客户端请求。
可以同时处理多个客户端的请求,创建子进程/子线程来处理跟客户端的请求,
或者利用I/O多路复用实现并发。
1.多进程实现并发
若问到多线程实现并发的特点,可以结合线程自己的特点回答优劣势。
2.多线程实现并发
若问到多进程实现并发的特点,可以结合进程自己的特点回答优劣势。
3.I/O多路复用
select、poll、epoll
多进程实现并发流程:
void handler(int sigo)
{
while (waitpid(-1, NULL, WNOHANG) > 0);
//一个SIGCHLD可能对应多个僵尸进程,循环收尸
}
int sockfd = socket(...);
bind(...);
listen(...);
signal(SIGCHLD, handler);
//注册SIGCHLD信号,当产生SIGCHLD信号时调用handler函数
while(1) {
int connfd = accept(...);
if (fork() == 0) {
close(sockfd);
while(1)
{
recv(...);
process(...);
send(...);
}
close(connfd);
exit(...);
}
close(connfd);
}
实现步骤
后面的close(acceptfd)是让父进程关闭这个用于通信的文件描述符,继续在accept哪里进行阻塞
信号函数为什么放到上面 因为是有信号来了就会打断执行相应的函数处理函数
作业:实现多线程实现并发
实现思想:
主线程里面:acceptfd先阻塞等待客服端进行链接,创建一个线程去循环接受消息,主线程阻塞等待客户进行链接9
函数pthread——create(&tid,NULL,headler,&acceptfd)把建立链接的文件描述符给传递过去
然后把线程设置成游离态自动回收线程 函数pthread_detach(tid)线程结束系统自动回收资源
线程函数里面:接收实参强转并且取地址内容 int acceptfd=*((int *)arg),然后循环接受消息 ,如果通信结束关闭文件描述符, 最后回收线程。