fork并发服务器

核能气质少年 提交于 2019-12-11 02:31:36

并发服务器需要使用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的读写功能。

 

并发服务器图示:

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!