Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4183825
  • 博文数量: 776
  • 博客积分: 13014
  • 博客等级: 上将
  • 技术积分: 10391
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-22 17:00
文章分类

全部博文(776)

文章存档

2015年(55)

2014年(43)

2013年(147)

2012年(20)

2011年(82)

2010年(429)

分类: 系统运维

2010-05-08 08:02:31

服务器编程之fork并行模式

摘要:网络编程本身并不复杂或多么困难,复杂或困难的是在不稳定的网络中做到稳定的服务器与通信,此时并行技术是实现的稳定的服务器的技术之一,当然也不是服务器端使用的技术。fork是POSIX系统中产生新进程的唯一方法,可以实现进程并行编程模式。

在介绍服务器编程的fork模式之前,我们首先来说说fork自身的问题,对于深知fork的读者可以跳过本段内容。fork通常作为一个系统调用来存在,或者作为一个系统调用的简单封装,它对于内核来说只做一件事:把当前进程的内存镜像复制一份,以在系统中产生一个新进程,并在两个进程中各返回一次,新产生的进程与原本的进程完全相同,它们共享着文件描述符,如此在两个进程中可以对同一文件进行操作,套接字也如此。

服务器编程的fork并行模式的基本的思想是:一个进程监听一相应的端口,当取得一个客户连接的时候,它使用fork产生一个新进程,由于新进程是原进程的复本,所以它可以与客户完成通信,而原来的父进程仍然继续监听那个端口,下面是一个典型的代码片断:

#include
#include
#include

int main()
{
        //如同串行的程序,这之前完成许多初始工作
        //下面代码假设sockfd是一个监听套接字

        while(1)
        {
                //如果想知道客户地址,后面两个参数可以指定相应的结构
                int cfd=accpet(sockfd, NULL, NULL);
                int pid=fork();
                if(0>pid)
                {
                        //创建进程失败,我们直接退出服务器
                        //这只是一个示例程序
                        return -1;
                }
                else if(0<pid)
                {
                        close(cfd);
                        continue;
                }

                //此处代码我意在让新进程运行,此时pid==0是明显的
                close(sockfd);
               
                //新进程使用cfd与客户进程进行通信
                //在通信结束之后,新进程也许就直接退出了
        }
}

上述的代码片断只是一个示例性的,以简单明了为基础,但它却直接而不明白反应了fork并行模式的基本思想。在实际中的程序还可以需要对信号进行处理,尤其当新进程比父进程早退出的时候,父进程会收到一个SIGCHILD信号,如果父进程不wait或waitpid的话,它将变成一个僵死进程,显然这是不希望的。

阅读(1447) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~