具有代表性的并发服务器端实现模型和发:
1、多进程服务器:通过创建多个进程提供服务。
2、多路复用服务器:通过捆绑并统一管理I/O对象提供服务。
3、多线程服务器:通过生成与客户端等量的线程提供服务。
进程:“占用内存空间的正在运行的程序”。
从操作系统的角度看,进程是程序流的基本单位,若创建多个进程,则操作系统将同时运行。有时一个程序运行过程中也会产生对个进程。接下来要创建的多进程服务器就是其中的代表。编写服务器端前,先了解一下通过程序创建进程的方法。
1、进程ID
无论进程是如何创建的,所有进程都会从操作系统分配到ID,此ID称为“进程ID”,其值是大于2的整数,1要分配给操作系统启动后的首个进程。
通过命令ps au 查看进程信息
2、通过调用fork函数创建进程
创建进程的方法有很多,下面介绍用于创建多进程服务器端的fork函数
#include <unistd.h> /* Clone the calling process, creating an exact copy. Return -1 for errors, 0 to the new process, and the process ID of the new process to the old process. */ extern __pid_t fork (void) __THROWNL;
成功时返回进程ID,失败时返回-1。for函数将创建调用的进程副本,复制正在运行的,调用fork函数的进程。两个进程都将执行fork函数调用后的语句。但由于通过同一个进程、复制相同的内存空间,之后的程序流要根据fork函数的返回值加以区分。
父进程:fork函数返回子进程ID
子进程:fork函数返回0
以时间代码为例
1 #include <stdio.h> 2 #include <unistd.h> 3 4 int gval = 10; 5 int main(int argc, char *argv[]) { 6 pid_t pid; 7 int lval = 20; 8 gval ++, lval += 5; 9 10 pid = fork(); 11 if(pid == 0) 12 gval += 2, lval += 2; 13 else 14 gval -= 2, lval -= 2; 15 if(pid == 0) 16 printf("Child Proc: [%d, %d] \n",gval, lval); 17 else 18 printf("Parent Proc: [%d, %d] \n",gval, lval); 19 return 0; 20 }