{1 g! x6 L. g1 W1 \) {
initialize();
/ D% R2 q3 U: B5 h8 i while (FCGI_Accept() >= 0) {# f; M( n) ?+ S+ |& Y) ^
printf("Content-type: text/html\r\n"
& y9 L4 w" O1 ]% \$ L3 j2 Z* m "\r\n"" @5 m4 z8 T8 {0 T# x% K9 L' ~; r+ v
""
0 d/ y' S+ Z- p2 M! w9 I "
, M7 ^! w5 P2 D- ~7 B+ [& S FastCGI Hello! (C, fcgi_stdio library)
% k4 v. U/ U* m; A "
5 H5 O# Q/ a9 N! @ "Request number %d running on host %s\n",+ E& x, d: z- T, q
++count, getenv("SERVER_HOSTNAME"));5 Z: J3 }: T1 @, b5 J8 l
}( y5 V, a( z) w- H* n- G9 y+ { U
}$ H5 n+ u6 A( G* d
例2:原始数据产生器
6 I4 y8 Y7 F! {& [" h 思考一下,一个应答应用程序产生第N次原始数据。# ?# l2 S9 \7 \! R" b4 Z
一个CGI应用程序将没有有效的方法来解决这个问题。例如,如果用户访问第50000次的原始数据,那么CGI应用程序就不许从第一条原始数据开始计算,知道第50000条的,要是应用程序终止,伴随着她辛苦积累的数据也会随之消失。
8 g, ?' ]: T- y, m2 [ 如果一个客户端想访问第4900条原始数据,那么服务器必须重新开始积累。
! C; ?* p4 ^! N+ w 由于我们能维持这个状态,FastCGI应用程序对与这样的问题就更有效。一个FastCGI应用程序在初始化阶段能够计算一个扩展的源数据的表,并保持表的不同范围。当客户端请求一个特别原始数据的时候,循环应答需要从表里查询。
, J: l# T: m& W9 S3 `7 E3 R* g4 w 这里有一个原始数据代码事例:; y+ W$ n4 L* G* ^! Z' }# Z
#include "fcgi_stdio.h"
# ^! @ l" |7 S- A4 q+ O #include
: o4 m( U2 @1 q1 Y; X #include* i. Y' F/ w* a) F1 q3 F8 H+ ?
#define POTENTIALLY_PRIME 0
% Y1 C( I/ x6 n #define COMPOSITE 1
1 l! f7 I8 v- t# d+ n% f #define VALS_IN_SIEVE_TABLE 1000000$ E) M! `0 Z" O8 X( M% N
#define MAX_NUMBER_OF_PRIME_NUMBERS 78600# H: d$ s7 s) o, V
long int sieve_table[VALS_IN_SIEVE_TABLE];
2 E5 M' ^7 b4 h* q+ G! A long int prime_table[MAX_NUMBER_OF_PRIME_NUMBERS];
* ^" r) _5 z% L1 m void+ ]# k: ^& N/ I# t2 T
initialize_prime_table(void)
3 O; G) z; r" s5 {% O1 R! K! \2 e1 n {; d2 u4 B; c: A% A
long int prime_counter=1;' t/ P m* |) _) D7 j j5 b/ o
long int current_prime=2, c, d;
6 l9 G8 ]) O9 R prime_table[prime_counter]=current_prime;% o4 ]; H3 {- p7 F+ F7 h5 G/ l6 s
while (current_prime < VALS_IN_SIEVE_TABLE) {3 m- B2 t K/ f
for (c = current_prime; c = 0) {; w6 j% j% t+ o" X( _& c/ i6 z
printf("Content-type: text/html\r\n" |