并发服务器需要使用fork进行实现,其是unix中派生新进程的唯一方法。
fork函数定义
#include <unistd.h>
pid_t fork(void);
调用fork一次,返回两次:
- 在调用进程(父进程)中返回一次,返回值为子进程ID;(父进程有多个子进程,通过返回来获取跟踪。)
- 在子进程中又返回一次,返回值为0;(子进程可以通过getppid获取父进程的ID)
通过返回值告知进程本身当前是子进程还是父进程。
并发服务器:
并发服务器使用fork子进程来服务每个客户。
典型使用:
listenfd = socket(...);
bind(listenfd , ...);
listen(listenfd , MaxClient);
for(;;)
{
connfd = accept(listenfd, ...);//侦听套接字转化为连接套接字,父进程继续等待。
if ( pid = fork() == 0)//子进程,父子共享的引用计数值变为2
{
close(listenfd);//子进程关闭侦听套接字
do(connfd); //处理子进程连接套接字
close(connfd); //子进程关闭连接套接字 (仅仅把引用计数减1,并不是真的关闭套接字)
exit(0);
}
close(connfd);//父进程关闭连接套接字(引用计数再次减1,若为0,则真正关闭套接字。)
}
注意,上述代码中,fork使得父子共享的引用计数变为2,执行close只是将引用计数减1,套接字真正的清理和资源释放要等到引用计数为0时才执行。
如果确实想在某个TCP连接上发生FIN,可以调用shutdown,其不管引用计数就能激发TCP正常终止系列。
#include <unistd.h>
int clode(int sockfd);
#include <sys/socket.h>
int showdown(int sockfd, int howto);
howto的方式有三种分别是
SHUT_RD(0):关闭sockfd上的读功能,此选项将不允许sockfd进行读操作。
SHUT_WR(1):关闭sockfd的写功能,此选项将不允许sockfd进行写操作。
SHUT_RDWR(2):关闭sockfd的读写功能。
并发服务器图示:

来源:CSDN
作者:u010034085
链接:https://blog.csdn.net/u010034085/article/details/103481843