摘要:网络编程本身并不复杂或多么困难,复杂或困难的是在不稳定的网络中做到稳定的服务器与通信,此时并行技术是实现的稳定的服务器的技术之一,当然也不是服务器端使用的技术。fork是POSIX系统中产生新进程的唯一方法,可以实现进程并行编程模式。
在介绍服务器编程的fork模式之前,我们首先来说说fork自身的问题,对于深知fork的读者可以跳过本段内容。fork通常作为一个系统调用来存在,或者作为一个系统调用的简单封装,它对于内核来说只做一件事:把当前进程的内存镜像复制一份,以在系统中产生一个新进程,并在两个进程中各返回一次,新产生的进程与原本的进程完全相同,它们共享着文件描述符,如此在两个进程中可以对同一文件进行操作,套接字也如此。
服务器编程的fork并行模式的基本的思想是:一个进程监听一相应的端口,当取得一个客户连接的时候,它使用fork产生一个新进程,由于新进程是原进程的复本,所以它可以与客户完成通信,而原来的父进程仍然继续监听那个端口,下面是一个典型的代码片断:
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
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的话,它将变成一个僵死进程,显然这是不希望的。